快速排序模板


  

引言:

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用。

说明

  快速排序算法经常被采用,而且快速排序也采用了分治的思想,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。
  总的说来,要直接默写出快速排序还是有一定难度的,以下为快速排序的模板,希望对大家快速上手有帮助,达到快速排序,快速搞定的效果。

该方法的基本思想是

  • 先从数列中取出一个数作为基准数。(通常就取最左边的数作为基准)
  • 分区过程,将比这个数小的数全放到它的左边,大于或等于它的数全放到它的右边。(并不是很严谨)
  • 再对左右区间重复第二步,直到各区间只有一个数。

模板一(左右挖坑互填)

public void quickSort(int[] s, int l, int r) {
    if (l < r) {
    	//Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换。参见注1
        int i = l, j = r;
        int x = s[l];
        while (i < j) {
            while (s[j] >= x && i < j) j--; // 从右向左找第一个小于x的数
            if (i < j) s[i++] = s[j];
            while (s[i] < x && i < j) i++;  // 从左向右找第一个大于等于x的数
            if(i<j) s[j--] = s[i];
        }
        s[i] = x;
        quickSort(s, l, i - 1); //递归调用
        quickSort(s, i + 1, r);
    }
}

模板二(左右交换)

public void quickSort(int[] s, int l, int r) {
    if (l < r) {
        int i = l, j = r;
        int temp = s[i];
        while (i < j) {
            while (s[j] >= s[l] && i < j) j--;
            while (s[i] <= s[l] && i < j) i++;
            temp = s[i]; //交换i、j位置元素
            s[i] = s[j];
            s[j] = temp;
        }
        s[i] = s[l]; //交换i、l位置元素
        s[l] = temp;
        quickSort(s, l, i - 1); //递归调用
        quickSort(s, i + 1, r);
    }
}

模板三(顺序遍历交换)

public void quickSort(int[] s, int l, int r) {
    if (l < r) {
        int base = s[l];//选取一个基准
        int index = l;
        for (int i = index + 1; i <= r; i++) {
            if (s[i] >= base) continue;
            index++;
            //交换
            int temp = s[i];
            s[i] = s[index];
            s[index] = temp;
        }
        s[l] = s[index];
        s[index] = base;
        quickSort(s, l, index - 1);
        quickSort(s, index + 1, r);
    }
}

  快速排序还有很多改进版本,如随机选择基准数,区间内数据较少时直接用另的方法排序以减小递归深度。有兴趣的同学可以再深入的研究下。

注1:有的书上是以中间的数作为基准数的,要实现这个方便非常方便,直接将中间的数和第一个数进行交换就可以了。


文章作者: YangChongZhi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 YangChongZhi !
评论
 上一篇
最长递增子序列 最长递增子序列
   引言: 最长递增子序列问题是一个很基本、较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法。这个问题能运用学过的基本的算法分析和设计的方法与思想,能够锻炼设计较复杂算法的思维。转
2021-03-04
下一篇 
二进制状态压缩枚举子集 二进制状态压缩枚举子集
   引言: 二进制数可以用来表示一个状态,比如当我们需要去表示一个集合的子集时,可以用二进制数来表示该子集。 问题  比如有一个集合,集合中的元素为 {1, 5, 7, 9, 12},如何快速找到其所有的子集合呢。这就可以采用二进制来压
2021-02-27
  目录