排序算法java實現快速排序

 

public class QuickSort {

//快速排序:

//基本思想:(分治)

//先從數組中取出一個數作爲key值;

//將比這個數小的數全部放在它的左邊,

//大於或等於它的數全部放在它的右邊,

//對左右兩個小數組重複上述步驟,直到各個區間只有1個數

 

//輔助理解:(挖坑填數)

//初始時:i=0;j=8;key=6

//由於已經將a[0]中的數保存到key中,可以理解成在數組a[0]上挖了個坑,可以將其他數據填充到這裏來。

//從j開始向前查找一個比key小的數,當j=8,符合條件,a[0]=a[8];i++;

//將a[8]挖出再填上一個坑a[0]中。

//這樣一個坑a[0]就被搞定了,單有形成了一個新坑a[8]。

//再找個數字來天a[8]這個坑,

//這次從i開始向後找一個大於key的數,當i=4,符合條件,a[8]=a[4];j--;將a[4]挖出填到上一個坑中。

//此時i=4;j=8;key=6;

//再重複上面的步驟,先從後向前找,再從前向後找

//從j開始向前找,當j=5時符合條件,將a[5]挖出填到上一個坑中,a[3]=a[5];i++;

//從i開始向後查找,當i=5時,由於i==j退出,此時i=j=5,而a[5]剛好是上次挖的坑,將key填入a[5]

//最終可以看出a[5]前面的數字都小於它,a[5]後面的數字都大於它,然後再對a[0]到a[4]、a[6]到a[8]這兩個子區間重複上述步驟

 

//注意:key值的選取可以有多重形式,例如中間數或者隨機數,分別對算法的複雜度產生不同的影響。

 

 

//平均時間複雜度:O(nlogn)

 

public static void main(String[] args) {

int[] arr = new int[]{6,2,4,1,9,3,6,7,0};

System.out.println("排序前=====");

print(arr);

System.out.println("");

System.out.println("排序後=====");

quickSort(arr,0,arr.length-1);

print(arr);

}

public static void quickSort(int[] arr,int left,int right){

if(left>=right)

return ;

int i = left;

int j = right;

int key = arr[left];//選擇第一個數作爲key

 

while(i<j){

 

while(i<j && arr[j]>=key)//從右向左找

j--;

if(i<j){

arr[i] = arr[j];

i++;

}

 

 

while(i<j && arr[i]<key)//從左向右找

i++;

if(i<j){

arr[j] = arr[i];

j--;

}

}

 

//i=j

arr[i] = key;

quickSort(arr,left,i-1);//遞歸調用

quickSort(arr,i+1,right);//遞歸調用

 

 

}

public static void print(int[] arr){

for(int i=0; i<arr.length; i++){

System.out.print(arr[i]+",");

}

}

}

 

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