快速排序:
将待排的序列一分为二,将待排序的第一个值作为基准,比这个值小的放在基准值的前面,比这个值大的放在基准值的后面,然后再将小的部分和大的部分进行一份为二,直到全部分完就已排好序
代码如下:
//快速排序 void charge(int& a, int& b) { int temp = a; a = b; b = temp; } int part_sort(int unsort[], int low, int lenght) { int flag = unsort[low]; int i = low, j = lenght; while(i < j) { while(i<j && unsort[i] < unsort[j]) j--; charge(unsort[i], unsort[j]); while(i<j && unsort[j] > unsort[i]) i++; charge(unsort[i], unsort[j]); } return i; } void quick_sort(int unsort[], int low, int lenght) { if(low < lenght) { int flag = part_sort(unsort, low, lenght); quick_sort(unsort, low, flag-1); quick_sort(unsort, flag+1, lenght); } }
注意:
1.运用了递归的思想
2.划分的时候应该注意有两个标志值i,j ,i为当前所要分割数组的第一个索引,j是最后一个索引
eg:
初始:9,7,2,11,10,16
第一次分割:基准是9, i=0, j=5
基准与a[j]比较 若a[j]大 则j进行-- 直到找到一个比基准小的 当找到时进行互换,然后再用基准值与a[i]进行比较,若 a[i]大则 i++知道找到一个比基准值大的,互换,依次进行,直到i!<j停止
具体如下:
基准与a[j]比较:
9<16 j-- j=4
9<10 j-- j=3
9<11 j-- j=2
9>2 a[i]与a[j]互换 得到 2,7,9,11,10,16
基准与a[i]比较:
9>2 i++ i=1
9>7 i++ i = 2
因为 此时 i !< j,所以停止,此次为2,7,9,11,10,16
进行递归的排列{2,7} 和{11,10,16}
浙公网安备 33010602011771号