我之前有写过相关快速排序的,但是因为当时对递归和分治的思维还是不够熟悉。所以对快速排序一知半解,现在再来做一个总结:
首先快速排序步骤如下:
1,设k = a[0],将k挪到适当的位置,使得比k小的元素在k的左边,比k大的元素在k的右边,和k是相等的,不关心在k左右均可。
2,对k的左边进行快速排序
3,对k的右边进行快速排序。
后面对过程进行一步步的分析:
k就是开头的红色的数字,j其实就是最尾巴的一个数字。现在就是要把j与i来比较,如果a[j]对应的值是大于k的值的话,那就不进行交换,进行j--。
现在j到了2的位置,2是小于k的所以进行交换。进行了一次交换后(现在是进行了一次奇数次的交换),就开始i往前走了(现在转尾偶数次了)。
知道找到了一个8了进行交换(现在是偶数次的交换了),偶数次的交换时左往右交换。现在又是从右边开始往里找了。
现在就是第一次快速排序进行完了的时候。后面写一下快速排序的代码。
代码:
void QuickSort(int a[],int s,int e){ int i = s; int j = e; //如果一开始传进来的s和e 是不合格的话就直接return掉 if(s >= e ){ return; } int k = a[0]; while(i !=j ){ while(j > i && a[j]>=k){ j--; } //注意每次都是先进行 右边的交换 swap(a[i],a[j]); while(j<i && a[i] <= k){ i++; } //右边的交换完了之后在进行左边的交换。 swap(a[i],a[j]); }//这个i这个循环结束了就是中间的位置 QuickSort(a,s,i-1); //对左边进行快速排序 QuickSort(a,i+1,e); //对右边进行快速排序 }