【Algorithm】快速排序(续)
前面在常用的排序算法中,已经写过一篇关于快速排序算法的博客,但是最近看到《The C Programming Language》这本书中的快速排序算法写的不错,所以就拿过来分享一下,下面我们来看一下吧。
快速排序算法是C. A. R. Hoare于1962年发明的。快速排序思想是:对于一个给定的数组,从中选择一个元素,以该元素为界将其余元素划分为两个子集。一个子集中的所有元素都小于该元素,另一个子集中的所有元素都大于或等于该元素。对这样两个子集递归执行这一过程,当某个子集中的元素数小于2时,这个子集就不需要再排序,终止递归。
从执行速度来讲,下列版本的快速排序函数可能不是最快的,但它是最简单的算法之一。在每次划分子集时,该算法总是选取各个子数组的中间元素。
/*============================================================================= # # FileName: fastSort.c # Algorithm: 快速排序 # Author: Knife # Created: 2014-06-27 16:35:36 # =============================================================================*/ #include <stdio.h> /* swap函数:交换v[k]与v[j]的值 */ void swap(int v[], int k, int j) { int temp; temp = v[k]; v[k] = v[j]; v[j] = temp; } /* 快速排序 */ void qsort(int v[], int left, int right) { int j, last; if (left >= right){ /* 若数组包含的元素个数少于两个,则return */ return; } swap(v, left, (left + right)/2); /* 将划分子集的元素移动到v[left] */ last = left; for (j = left+1; j <= right; j++){ /* 划分子集 */ if (v[j] < v[left]){ swap(v, ++last, j); } } /* 将分割点left放到last的位置,这样可以保证现在序列为【小小...小[关键字]大大...大】 */ swap(v, left, last); /* 分别对分割点的左右子集进行递归 */ qsort(v, left, last-1); qsort(v, last+1, right); } void main() { int j; int arr[] = {14,10,11,5,6,15,0,15,16,14,0,8,17,15,7,19,17,1,18,7}; qsort(arr, 0, 19); for(j=0; j<=19; j++){ printf("%d ", arr[j]); } printf("\n"); }