无数个夜晚只因为你夜不能寐-快速排序

Posted 软件工程师涨薪姿势

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无数个夜晚只因为你夜不能寐-快速排序相关的知识,希望对你有一定的参考价值。


道阻且长,吾将上下而求索

  • 快速排序的原理

    • 1.基本思想

    • 2.代码实现

    • 3.时间空间效率

    • 4.使用场景

    • 5.下期预告


快速排序的原理

快速排序之所以叫这个名字,跟她的出生有很大的关系,是由外国的一个顶级天才想出来,至于是谁这里咋也不想查,有兴趣的可以去网上搜索相关的资料了解。在这里我想从三个角度来重新解读快速排序这个思想 ,她在八大排序中属于交换排序,八大排序包括直接插入排序,希尔排序,冒泡排序,快速排序,直接选择排序,堆排序,归并排序,基数排序。

1.基本思想

快速排序的一般过程是,随机选取数组中的一个值,作为比较标准,一般称之为枢值(Pivot)。然后把整个数组中小于枢值的数据分到一个组,把大于枢值的数据分到另一个组,等于枢值的数据分到哪个组都可以。分成两组后,自然不会用其他排序对小数组进行排序,而是重复以上的步骤,把小的数组再细分。这样整个数组就由1个数组变成2个数组,再变成4个数组,再变成8个数组,到最后分无可分,简单比较一下,整个数组就变得有序了。
简单描述一下:

选择枢值。也就是选择一个数据作为标杆。选择枢值其实是最重要的一个步骤,比较推荐的方法是,选择数组中第一个、中间以及最后一个数据中的中值。

分组操作。把大于枢值的数据放到枢值右边,把小于枢值的数据放到左边。与枢值相等的数据放到哪边无所谓。

递归。对左右两边的数据进行枢值选取和分组操作。递归的停止条件是细分数组数据个数为0或者1。

2.代码实现

public static void quickSort(int[] arr, int startIndex, int endIndex) {

// 递归结束条件:startIndex大等于endIndex的时候

if (startIndex >= endIndex) {

return;

}

// 得到基准元素位置

int pivotIndex = partition(arr, startIndex, endIndex);

// 用分治法递归数列的两部分

quickSort(arr, startIndex, pivotIndex - 1);

quickSort(arr, pivotIndex + 1, endIndex);

}


private static int partition(int[] arr, int startIndex, int endIndex) {

// 取第一个位置的元素作为基准元素

int pivot = arr[startIndex];

int left = startIndex;

int right = endIndex;

// 坑的位置,初始等于pivot的位置

int index = startIndex;

//大循环在左右指针重合或者交错时结束

while ( right >= left ){

//right指针从右向左进行比较

while ( right >= left ) {

if (arr[right] < pivot) {

arr[left] = arr[right];

index = right;

left++;

break;

}

right--;

}

//left指针从左向右进行比较

while ( right >= left ) {

if (arr[left] > pivot) {

arr[right] = arr[left];

index = left;

right--;

break;

}

left++;

}

}

arr[index] = pivot;

return index;

}

3.时间空间效率

快速排序和冒泡排序属于交换排序。快速排序的时间复杂度为O(N*logN),和归并排序、希尔排序(插入排序)、堆排序(选择排序时间复杂度一样,空间复杂度为O(logN)。

4.使用场景

想了很久还是决定加上这个二级标题,一个算法诞生的那一刻就算是要解决具体的问题的,快速排序在数据量较大且是随机分布的情况下表现的最好。

5.下期预告

什么是堆排序?

以上是关于无数个夜晚只因为你夜不能寐-快速排序的主要内容,如果未能解决你的问题,请参考以下文章

译文:18个实用的JavaScript代码片段,助你快速处理日常编程任务

Android片段中的动态背景

少年,来点正能量吧!

少年,来点正能量吧!

快速排序-递归实现

基于快速排序方法改成求第k大的数