首页 > 代码库 > 数据结构——排序——快排序算法

数据结构——排序——快排序算法

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 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

数据结构——排序——快排序算法