每周一算-快速排序

Posted Chicken Run Run

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每周一算-快速排序相关的知识,希望对你有一定的参考价值。


1.算法思想

取最左边的数为基准,使得左边的数都小于基准数,右边的数都大于基准数;然后依次类推;
要实现上述的过程,就需要进行比较后交换,并且最终把基准数放到正确的位置上,过程如下:

2.过程

例如6,1,2,7,9,3,4,5,10,8

以最左侧6为基准数, 从右侧向左侧找到小于6的数字;

从右向左找到大于6的数字;

第一趟:

每周一算-快速排序

右侧找到5<6停下来;

左侧找到>6的数停下来;

每周一算-快速排序

然后交换5和7的位置left right指针不动; 如下

每周一算-快速排序

然后再继续从右侧right找小于6的数字, 从左侧找大于6的数字;

每周一算-快速排序


交换后结果如下:

每周一算-快速排序

3.代码如下

package sort;

/**
* Created by IntelliJ IDEA.
* 快速排序;
*/

public class QuickSort {

public static void main(String[] args) {
int[] ax={1,2,5,9,5,4,3,0,0};
quickSort(ax,0,ax.length-1);
for (int i = 0; i < ax.length; i++) {
System.out.print(ax[i]+ " ");
}
}
public static void quickSort(int arr[],int left ,int right){
if(left>right){
return;
}
//找到最左侧的基准数;
int base = arr[left];
int i = left;
int j = right;
//以基准数为基础,从右侧找到小于基准数的数字;
//以基准数为基础,从左侧开始找到大于基准数的数字;
while (i!=j){
while (arr[j]>=base && i<j){
j--;
}
while (arr[i]<=base && i<j){
i++;
}
//找到后交换两个数;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//交换基准数,left==right;
arr[left] = arr[i];
arr[i] = base;

//继续剩下的左边的集合;
quickSort(arr,left,i-1);
//继续剩下的右边的集合;
quickSort(arr,j+1,right);
}
}

4. 查询效率

平均情况下快速排序的时间复杂度是O(nlgn),最坏情况是O(n2)。

5. 总结

欠的总是要还的



以上是关于每周一算-快速排序的主要内容,如果未能解决你的问题,请参考以下文章

快速排序和堆排序

算法理解—— 快速排序 v2.0

快速排序-递归实现

经典算法学习——快速排序

PHP 四种基本排序算法的代码实现

快速排序