经典排序--》快速排序--》详解

快速排序的介绍

        

快速排序(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的值 


这样就完成了从大到小的排序 , 如有错误,请指出,谢谢.

    




猜你喜欢

转载自blog.csdn.net/qq_40646143/article/details/80767417