快速排序的兩種實現方式(Java)

快速排序基於分治思想,期望時間複雜度可以達到O(nlgn),並且是一種穩定的排序算法。


/**
	 * 快速排序,選取最後一個元素作爲參考,輸出數組的非遞減序列
	 * @param array		待排序的數組
	 * @param start		要排序數組的開始位置
	 * @param end		要排序數組的結束位置
	 */
	public void quickSort(int array[] , int start , int end)
	{
		if(array == null || array.length < 2 || start >= end)
		{
			return;
		}
		//選取最後一個元素作爲參考
		int flag = array[end];
		
		//記錄大於flag的第一個元素位置
		int i = start-1;
		//標識當前遍歷的位置
		int j = start ;
		
		while(j < end)
		{
			//當元素小於flag時,與++i進行交換
			if( array[j] < flag)
			{
				i++;
				swap(array,i,j);
			}
			j++;
		}
		//將flag交換到合適的位置
		int mid = i + 1;
		swap(array,mid,end);
		
		//對左右子數組進行遞歸排序
		quickSort(array,start,mid -1);
		quickSort(array,mid + 1,end);
	}
	
	/**
	 * 快速排序,選取最後一個元素作爲關鍵值,輸出數組的非遞減序列
	 * @param array		待排序的數組
	 * @param start		要排序數組的開始位置
	 * @param end		要排序數組的結束位置
	 */
	public void quickSort2(int array[] , int start , int end)
	{
		if(array == null || array.length < 2 || start >= end)
		{
			return;
		}
		
		int flag = array[end];
		//1.從左向右遍歷,尋找比flag大的元素left
		//2.從右向左遍歷,尋找比flag小的元素right
		//3.交換元素位置,直到left >= right , 將參考值交換到合適的位置
		int left = start;
		int right = end;
		while(left < right)
		{
			if(array[left] <= flag)
			{
				left++;
			}else if(array[right] >= flag)
			{
				right--;
			}else
			{
				swap(array,left,right);
			}
		}
		
		//將flag交換到合適的位置
		swap(array,left,end);
		
		//對左右子數組進行遞歸排序
		quickSort2(array,start,left -1);
		quickSort2(array,left + 1,end);
	}
	/**
	 * 交換數組中兩元素的位置
	 * @param array
	 * @param x		
	 * @param y
	 */
	private void swap(int array[] , int x , int y)
	{
		int temp = array[x];
		array[x] = array[y];
		array[y] = temp;
	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章