快速排序算法 quick sort

1.快速排序 quick sort是什么?

    快速排序算法:
    是对冒泡排序的改进,将一个整体分为俩个部分,找一个基准点分,然后采用递归进行排序,使之成为一个有序的序列.

    作用:提高查询效率 能最大程度的利用资源.

2.怎么做?  来一个生动的理解^^
1.找一个基准数 所有的值都与基准数相比较 大的在基准数的右边小的在基准数的左边 俩个出发的小孩子比大小,俩个小孩子都有自己的任务,一个是从左往右专门找比基准小的数 另一个是从右往左专门找比基准大的数 找到了就停在那里 然后俩个小孩子的值互换位置 换了之后又开始找 (从俩边不断向中间寻找,比对) 直到他们俩相遇就代表第一轮排序完成.(安排一个小孩子先出发)


2. 如果基准数找不好也影响运行速度.好啦现在开始第二轮排序 一号和二号小孩都已经找到了属于他们那一边的数字, 现在 他们各自需要自己管理好自己的值,第二个任务就是 先把自己的数值排好顺序.俩个小孩都需要在自己的领域里找 相似于第一轮排序一样的基准数来进行排序,比如都从左往右找吧,每个数都是基准数来与下一个值相比较,原理就是将基准数归位.


每次排序的时候 都要设置一个基准点 然后将基准点归位,相较于冒泡排序来说,快速排序是属于跳跃式的.而冒泡排序是相邻之间的交换,快速排序的最坏结果也和冒泡排序是一样的.

以下代码示例:

package com.list;

public class demo02 {

	/**
	 * 一个++ 一个--  俩个交换
	 * @param list 集合
	 * @param leftNumber 最左边的值
	 * @param rightNumber 最右边的值
	 * @return 返回最右边的值
	 */
	public static int quickSort(int[] list,int leftNumber,int rightNumber) {
		//每次都以最右边的元素作为基准值  
		int baseNumber=list[rightNumber];
		//俩个下标一样的话 说明在同一个位置 代表需要结束循环了
		while(leftNumber<rightNumber) {
			while(leftNumber<rightNumber&&list[leftNumber]<=baseNumber) {
				//从左边开始遍历,如果比基准值小,就继续向右走  
				leftNumber++;
			}
			
			if(leftNumber<rightNumber) {
				//交换   要用第三个变量来替代 暂时存放的地方
				int test=list[leftNumber];
				list[leftNumber]=list[rightNumber];
				list[rightNumber]=test;
				rightNumber--;
			}
			
			//2号小朋友走
			while(leftNumber<rightNumber&&list[rightNumber]>=baseNumber)  
				//从右往左走 如果大于基准数就不交换 继续往前走 
				rightNumber--;
			 //上面的while循环结束时,就说明当前的a[end]的值比基准值小,应与基准值进行交换  
			 if(leftNumber<rightNumber) {
				 //反之 则比基准数小 则交换
				    int test=list[leftNumber];
					list[leftNumber]=list[rightNumber];
					list[rightNumber]=test;
			    //交换后,此时的那个被调换的值也同时调到了正确的位置(基准值左边),因此左边也要同时向后移动一位  
					leftNumber++;
			 }  
		     } 
		           return rightNumber;
	         }
	
	
	
	  public  static  void sort(int[] list,int leftNumber,int rightNumber) {
		  if(leftNumber>rightNumber) {
			  //如果只剩一个元素 就不需要在进行了
			  return ; 
		  }else {
			 int position=quickSort(list, leftNumber, rightNumber);
			 //递归的方法
			 sort(list, leftNumber, position-1);
			 sort(list, position+1, rightNumber);
		  }  
	      }
	        
	
	public static void main(String[] args) {
		//定义一个数组
		 int[] a = new int[]{1,2,7,8,3,4,5,6,9,10,23,100,32,21}; 
		//调用排序的方法
		sort(a, 0, a.length-1);
		System.out.println("排序后的结果:");  
		for (int i : a) {
			System.out.println(i+" ");
		}
	}
	 
	
	
}

结果是:


3.什么时候用?

如果你想要的结果是从小到大按升序来排序的话,你可以使用快速排序来做,反之你想要

按降序排序的话,快速排序就不建议使用了,因为快速排序的局限性就是只能升序查看结果.

猜你喜欢

转载自blog.csdn.net/qqqnzhky/article/details/80469383