原理
快速排序是对冒泡排序的改进,采用了分治策略(一般也会使用递归),因此减少了比较的次数。
基本思想
- 设置一个基准值,这个基准点可以随意设置,但是一般来说我们选择第一个数据。
- 用left标识数组的第一个数据,right标识数组的最后一个数据
- 如果right位上的数据大于基准值,则继续往后遍历(right- -);如果小于基准值,则将right位上的值赋值给left位。
- 让left往前遍历, 如果left位上的数据小于基准值,则继续往前遍历(left++);如果left位上的值大于基准值,则将left位上的值赋值给right位。
- 知道left==right这一趟排序就结束了,将基准值赋值给left位
- 再采用递归的方法将基准值位左边与右边的两部分数组分别进行快速排序。前半部分和后半部分均有序时该数组就自然有序了。
代码实现
//排序
int getindex(int a[],int left,int right){
int num=a[0];
while(left<right){
while(left<right&&a[right]>num){
right--;
}
a[left]=a[right];
while(left<right&&a[left]<num){
left++;
}
a[right]=a[left];
}
a[left]=num;
return left;
}
void QuickSort(int a[],left,right){
if(left<right){
int index=getindex(a,left,right);
}
QuickSort(a,left,index-1);
QuickSort(a,index+1,right);
}
快速排序之所以快,是因为相比冒泡排序,它每次交换都是跳跃式的,不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多。因此总的比较和交换次数就少了,速度自然就提高了。
快速排序的特性总结
时间复杂度:O(NlogN)(最坏情况下O(N^2));
空间复杂度:O(log2N)
稳定性:不稳定