快速排序


快速排序

思路

1.對於一個數組,首先先選擇一個基准值key,這個基准值可以隨意選,但是一般選擇的是這個數組的第一個元素a[0]
2.之后我們對於這個數組,把數組中所有比這個基准值key小的元素向基准值key的左邊扔,把數組中所有比這個基准值key大的元素朝基准值key的右邊扔
3.這樣的話基准值key就成為了一個"分界線",所有比基准值key小的元素都在基准值key的左邊,所有比基准值key大的元素都在key的右邊
4.之后我們在遞歸的對基准值key左邊的序列和右邊的序列進行快速排序
5.最終整個序列就是有序的了

圖解


轉載自http://www.pianshen.com/article/3751395422/

代碼實現

package sort;

public class QuickSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a= {10,9,8,7,6,5,4,3,2,1,0};
		for(int k:a)
		{
			System.out.printf("%d ",k);
		}
		System.out.println();
		quickSort(a, 0, a.length-1);
		for(int k:a)
		{
			System.out.printf("%d ",k);
		}
		
	}
	
	public static void quickSort(int a[],int left,int right)
	{
		if(left>=right)
		{
			return ;
		}
		int i=left;
		int j=right;
		int key=a[left];
		while(i<j)
		{
			while(i<j&&key<a[j])//從右向左找到第一個比key小的值
			{
				j--;//朝前面尋找
			}
			a[i]=a[j];//找到之后向左移動
			while(i<j&&key>a[i])
			{
				i++;//從左向右找,找到第一個大於key的值
			}
			a[j]=a[i];//將比較大的值移動到右邊
			
		}
		a[i]=key;//把key移動到中間來分割左右,i現在是分割左右的下標
		quickSort(a, left, i-1);
		quickSort(a, i+1, right);
		
	}

}

復雜度

  • 時間復雜度:O(nlogn)
  • 空間復雜度:快速排序使用遞歸,遞歸使用棧,因此它的空間復雜度為O(logn)
  • 穩定性:快速排序無法保證相等的元素的相對位置不變,因此它是不穩定的排序算法


免責聲明!

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



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