數據結構-快速排序算法

一趟快速排序的算法是:

1)設置兩個變量i、j排序開始的時候:i=0,j=N-1;

2)以第一個數組元素作爲關鍵數據,賦值給key,即key=A[0];

3)從j開始向前搜索,即由後開始向前搜索(j--),找到第一個小於key的值A[j],將A[j]和A[i]互換;

4)從i開始向後搜索,即由前開始向後搜索(i++),找到第一個大於key的A[i],將A[i]和A[j]互換;

5)重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小於key,4中A[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到爲止。找到符合條件的值,進行交換的時候i, j指針位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令循環結束)。

1)基本思想:選擇一個基準元素,通常選擇第一個元素或者最後一個元素,通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素,此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞歸地排序劃分的兩部分。

(2)實現代碼如下:

public class quicksort{ 
		/*
		 * 快速排序
		 */
		int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};   
		public quicksort(){  
		    quick(a);  
		    for(int i=0;i<a.length;i++){  
		       System.out.print(a[i]+" "); 
		    }
		}    
	    public int getMiddle(int[] list, int low, int high) {
	    	int tmp = list[low];    //數組的第一個作爲中軸     
		    while (low < high) {     
		    	while (low < high && list[high] >= tmp) {     
		    		high--;     
		    	}     
		    	list[low] = list[high];   //比中軸小的記錄移到低端     
		    	while (low < high && list[low] <= tmp) {     
		    		low++;     
		    	}     list[high] = list[low];   //比中軸大的記錄移到高端     
		     }     
		    list[low] = tmp;              //中軸記錄到尾     
		    return low;                   //返回中軸的位置  
		}    
		public void _quickSort(int[] list, int low, int high) {     
			if (low < high) {     
				int middle = getMiddle(list, low, high);  //將list數組進行一分爲二     
				_quickSort(list, low, middle - 1);        //對低字表進行遞歸排序     	  
				_quickSort(list, middle + 1, high);       //對高字表進行遞歸排序     
			}
		}   
		public void quick(int[] a2) {
			if (a2.length>0) {    //查看數組是否爲空     
				_quickSort(a2,0,a2.length-1);
			}
		}
		public static void main(String[] args) {
			quicksort qs=new quicksort();
			qs._quickSort(qs.a,0,qs.a.length-1);
		}
}


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