快速排序算法圖文詳解(模版使用)


算法介紹

快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

算法描述

快速排序使用分治法來把一個串(list)分為兩個子串(sub-lists)。具體算法描述如下:

步驟1:從數列中挑出一個元素,稱為 “基准”(pivot );
步驟2:重新排序數列,所有元素比基准值小的擺放在基准前面,所有元素比基准值大的擺在基准的后面(相同的數可以到任一邊)。在這個分區退出之后,該基准就處於數列的中間位置。這個稱為分區(partition)操作;
步驟3:遞歸地(recursive)把小於基准值元素的子數列和大於基准值元素的子數列排序。

算法實現

    public void quickSort(int[] num, int left, int right) {
		//如果left等於right,即數組只有一個元素,直接返回
		if(left>=right) {
			return;
		}
		//設置最左邊的元素為基准值
		int key=num[left];
		//數組中比key小的放在左邊,比key大的放在右邊,key值下標為i
		int i=left;
		int j=right;
		while(i<j){
			//j向左移,直到遇到比key小的值
			while(num[j]>=key && i<j){
				j--;
			}
			//i向右移,直到遇到比key大的值
			while(num[i]<=key && i<j){
				i++;
			}
			//i和j指向的元素交換
			if(i<j){
				int temp=num[i];
				num[i]=num[j];
				num[j]=temp;
			}
		}
		num[left]=num[i];
		num[i]=key;
		quickSort(num,left,i-1);
		quickSort(num,i+1,right);
	}

算法分析

時間復雜度度O(nlogn),空間復雜度(logn)。

不穩定排序(例a與b值相同,但是在比較后有可能會發生位置變化)

內排序(所有排序操作都在內存中完成)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM