快速排序的介绍
快速排序(Quick Sort)使用分治法策略。
它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序流程:
(1) 从数列中挑出一个基准值。
(2) 将所有比基准值小的摆放在基准前面,所有比基准值大的摆在基准的后面(相同的数可以到任一边);在这个分区退出之后,该基准就处于数列的中间位置。
(3) 递归地把"基准值前面的子数列"和"基准值后面的子数列"进行排序。
快速排序的运行流程
比如现在有一个数组里面有这样一个数据 { 3 , 7 , 5, 2 , 1 , 9 , 5 , 4 };下面要用快速排序进行排序.那要如何实现呢?
①第一步随便在数组中找到一个中间基点 如 (pivot=5),然后定义数组的最左边为i=3 , 数组的最右边为j=4, 如下图
那我们要实现什么效果呢? 主要就是把大于5的放在5的右边,小于5的放在数组的左边,如下图所示
i左边都是小于5的值一直向右边找比5大的值
j右边都是比5大的值一直向左边找比5小的值
如果i找到比5小的值 然后j找到比5大的值,然后i和j进行交换位置 ,一直找到i和j相碰撞,直到交叉错开,才保证左边的都比5小右边的都比5大.
第一次排序如下 i从左边找比5大的值,j从右边找比5小的值,如下图
这时i和j交换位置 如下图
i继续向右找比5大的值,j继续找比5小的值, 如下图
把i和j进行交换 ,如下图
i继续向右找比5大的值,j继续向右找比5小的值, 如下图
这时i和j已经错开了 说明查找已经结束了,i和j已经是一个分界线 如下图所示
下面是java代码实现快速排序
package com.hp.demo;
public class PaiXu {
//快速排序
public static void main(String[] args) {
Integer [] arr=new Integer[] {3,7,8,5,2,1,9,5,4};
query(arr, 0, arr.length-1);
for (Integer integer : arr) {
System.out.println(integer);
}
}
static void query(Integer[] arr,int left,int right){
//最左邊
int i=left;
//最右邊
int j=right;
//中间基点(取这个数组的中间点)
int tmp=arr[(i+j)/2];
while(i<=j){
while(arr[i]<tmp){ ////从左向右开始找找个一个比tmp大的值 如果没有则继续+1 向下找
i++;
}
while(arr[j]>tmp){ //从右向左找到一个比tmp小的值 如果没有继续-1向下找
j--;
}
if(i<=j){ //左边和右边进行交换
int zhong=arr[i];
arr[i]=arr[j];
arr[j]=zhong;
i++; //左边进行+1 寻找下一个比tmp大的值
j--; //右边进行-1 寻找下一个比tmp小的值
}
}
//从中间单已经分开 中间点左边的都比tmp小 右边的都比tmp大
if(left<j){
query(arr, left, j); //使用递归把tmp左边的再次进行快速排序
}
if(i<right){
query(arr, i, right); //使用递归再次把tmp右边的也再次进行排序
}
}
}
效果图为
如果要实现从大向小进行排序输出的话只需要改
我是这样理解的 arr[i]>tmp的时候i++ 继续向右找直到找到一个比tmp小的值
arr[j]<tmp 的时候 j-- 继续向左找找到一个比tmp大的值
然后 arr[i] 和 arr[j] 交换位置 所以左边的都是大于tmp的值 右边的都是小于tmp的值
这样就完成了从大到小的排序 , 如有错误,请指出,谢谢.