标签:des style blog http color io ar 使用 for
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实作出来。
使用快速排序法对一列数字进行排序的过程
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
步骤为:
1、从数列中挑出一个元素,称为 "基准"(pivot),
2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
#include <stdio.h> #include <stddef.h> void swap(int * a, int * b) //交换函数 { int tmp = * a; * a = * b; * b = tmp; } void printArray(int a[], int count) //打印数组元素 { int i; for(i = 0; i < count; i++) printf("%d ",a[i]); printf("\n"); } size_t partition(int * ary, size_t len, size_t pivot_i) //划分函数 { size_t i = 0; size_t small_len = 0; int pivot = ary[pivot_i]; swap(&ary[pivot_i], &ary[len - 1]); for (; i < len; i++) { if (ary[i] < pivot) { swap(&ary[i], &ary[small_len]); small_len++; } } swap(&ary[len - 1], &ary[small_len]); //交换元素 return small_len; } void quick_sort(int * ary, size_t len) { if (len == 0 || len == 1) return; size_t small_len = partition(ary, len, 0); quick_sort(ary, small_len); quick_sort(&ary[small_len + 1], len - small_len - 1); } int main(void) { int ary[] = {2, 4, 12, 25, 13, 5, 3, 1, 7, 6}; size_t len = sizeof(ary) / sizeof(ary[0]); printArray(ary, len); quick_sort(ary, len); printArray(ary, len); return 0; }
C89标准在stdlib.h中定义了抽象数据类型的快速排序函数qsort:
#include <stdio.h> #include <stdlib.h> static int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; } void printArray(int a[], int count) //打印数组元素 { int i; for(i = 0; i < count; i++) printf("%d ",a[i]); printf("\n"); } int main() { int arr[10] = {5, 3, 7, 4, 1, 9, 8, 6, 2}; size_t len = sizeof(arr) / sizeof(arr[0]); printArray(arr, len); qsort(arr, 10, sizeof(int), cmp); printArray(arr, len); return 0; }
未完· · ·
http://www.cnblogs.com/archimedes/p/quick-sort-algorithm.html
标签:des style blog http color io ar 使用 for
原文地址:http://www.cnblogs.com/qq1129496211/p/4047123.html