基本思想:快速排序算法的基本思想为分治思想。
1)先从数列中取出一个数作为基准数;
2)根据基准数将数列进行分区,小于基准数的放左边,大于基准数的放右边;
3)重复分区操作,知道各区间只有一个数为止。
算法流程:(递归+挖坑填数)
1)i=L,j=R,将基准数挖出形成第一个坑a[i];
2)j--由后向前找出比它小的数,找到后挖出此数a[j]填到前一个坑a[i]中;
3)i++从前向后找出比它大的数,找到后也挖出此数填到前一个坑a[j]中;
4)再重复2,3),直到i=j,将基准数填到a[i]。
时间复杂度:O(nlog(n)),但若初始数列基本有序时,快排序反而退化为冒泡排序。
void QuickSort(int a[], int L, int R) { if (L<R) { int i=L, j=R, temp=a[i]; while (i<j) { //从右向左找小于基准值a[i]的元素 while (i<j && a[j]>=temp) j--; if (i<j) a[i++]=a[j]; //从左向右找大于基准值a[i]的元素 while (i<j && a[i]<temp) i++; if (i<j) a[j--]=a[i]; } //将基准值填入最后的坑中 a[i]=temp; //递归调用,分治法的思想 QuickSort(a, L, i-1); QuickSort(a, i+1, R); } }