快速排序(排序系列)

77 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

本人的第一篇博客,先从基础的排序系列开始吧,写的不好希望大家谅解。

排序作为最基础的算法对于程序员来说也是必须要掌握的,至于为什么要把快速排序放在第一,那是因为一年前刚毕业时面试笔试时被要求手写过快速排序... 确实没写出来,只写了个冒泡

快速排序

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

  • 1.先从数列中取出一个数作为基准数。

  • 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

  • 3.再对左右区间重复第二步,直到各区间只有一个数。

    这里值得一说的是一般都会选择数列的第一个元素作为基准数,然后再从右边开始选择小于基准数的元素和左边大于基准数的元素进行交换,直到相遇。再把基准数和和相遇的元素交换位置,这样就能保证中间相遇的位置左边都小于基准数,右边都大于基准数。再分别把左边和右边进行排序即可。

快速排序.gif

废话不多说,直接上代码。

public static void quickSort(int[] nums, int begin, int end) {
 if (begin > end)
     return;
 // 选择第一个元素作为基准数
 int temp = nums[begin];
 int i = begin;
 int j = end;
 while (i != j) {
     //从右边开始寻找小于temp的数
     while (nums[j] >= temp && j > i)
         j--;
     //从左边寻找大于temp的数
     while (nums[i] <= temp && j > i)
         i++;
     //如果存在就交换位置
     if (j > i) {
         int t = nums[i];
         nums[i] = nums[j];
         nums[j] = t;
     }
 }
 //将基准数位置和中间相遇位置交换
 nums[begin] = nums[i];
 nums[i] = temp;
 //递归左边
 quickSort(nums, begin, i - 1);
 //递归右边
 quickSort(nums, i + 1, end);
}

至此,快速排序就结束了。新人需要鼓励和建议,谢谢大家!