快速排序

参考:快速排序

基于Java实现的快速排序

1、快排概述

快排的基本思想:

  1. 先从数列中取出一个数作为基准数;
  2. 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
  3. 再对左右区间重复第二步,直到各区间只有一个数。

快排中体现了分治思想,双指针。

快排相比其他排序方式的优势:快速排序之所以比较快,是因为相比冒泡排序,每次的交换都是跳跃式的,每次设置一个基准值,将小于基准值的都交换到左边,大于基准值的都交换到右边,这样不会像冒泡一样每次都只交换相邻的两个数,因此比较和交换的此数都变少了,速度自然更高。当然,也有可能出现最坏的情况,就是仍可能相邻的两个数进行交换,和冒泡排序一样是O(n2)。正常情况下,平均时间复杂度为O(NlogN)。

2、代码实现

挖坑填数方法总结:

1.i =low; j = high; 双指针指向首尾位置。将基准数挖出形成第一个坑s[i]。基准数用变量存储起来,此时原来基准数位置形成第一个坑。

2.j--由后向前找比它小的数,找到后挖出此数填前一个坑s[i]中。

3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑s[j]中。

4.再重复执行2,3二步,直到i==j,将基准数填入s[i]中。

利用分治思想,递归调用函数,所以在整个排序前,先判断low,high指针是否符合要求,提供排序效率,避免申请变量。

void quickSort(int[] s,int l,int h){
    if(l<h){
        int i=l,j=h;//双指针指向首尾位置
        int x=s[l];//取出基准数
        while(i<j){
            while(i<j&&s[j]>=x){//从右往左,找比基准数小的数
                j--;
            }
            if(i<j){
                s[i++]=s[j];//将s[i]的坑填上,并且指针向后移
            }
            while(i<j&&s[i]<x){//从左往右,找比基准数大的数
                i++;
            }
            if(i<j){
                s[j--]=s[i];
            }
        }
    }
    s[i]=x;
    quickSort(s,l,i-1);
    quickSort(s,i+1,h);
}
posted @ 2021-02-14 13:32  Jayzou11223  阅读(75)  评论(0编辑  收藏  举报