排序系列之——快速排序
快速排序是对冒泡排序的一种改进。
基本思想是基于分治法:
1、在待排序列表L[1···n]中任取一个元素pivot作为基准,通过一趟排序将待排序列表划分为独立的两部分L[1···k-1],L[k+1···n],使得L[1···k-1],中的所有元素都小于等于privot,L[k+1···n]中所有元素大于等于privot。则privot放在了其最终位置L(k)上。这个过程称之为一趟快速排序。
2、而后,分别递归对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素都放在了其最终位置上。
快速排序里最主要的的就是其分治法,
以下程序采用两种分治方法。
方法一较为简单,代码如下:
1 //8 12 4 13 18 2 int Partion(int *arr, int len)//(基本分割) 3 { 4 int left = 0; 5 int right = len -1; 6 7 int key = arr[0];//以第一个元素为枢轴值,对表进行划分--->对于随机数这是可行的。 8 while( left < right) 9 { 10 while( left < right && arr[right] >= key) --right; //走到 4 11 arr[left] = arr[right]; //将4赋值给arr[left] 12 13 if( left >= right) 14 break; 15 16 while( left < right && arr[left] <= key) ++left; //走到 12 17 arr[right] = arr[left]; 18 } 19 arr[left] = key;//交换8 4之后8的位置为left 20 return left; 21 }