設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用數組的第一個數)作爲關鍵數據,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱爲一趟快速排序。值得注意的是,快速排序不是一種穩定的排序算法,也就是說,多個相同的值的相對位置也許會在算法結束時產生變動。
一趟快速排序的算法是:
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-完成的時候,此時令循環結束)。
現象:可比較我的其他算法現象
組建數組元素個數:10000000(千萬)
組件隨機數組運行時間:233ms
排序運行時間:78ms
import java.util.Random;
public class QuitSort {
public static void show(int [] a){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+"、");
}
System.out.println();
}
public static int[] get_intarr(int len){
long begin = System.currentTimeMillis();
Random ran = new Random();
int [] result = new int[len];
for(int i=0;i<len;i++){result[i] = ran.nextInt(100); }
long runtime = System.currentTimeMillis()-begin;
System.out.println("組建數組元素個數:"+len);
System.out.println("組件隨機數組運行時間:"+runtime);
return result;
}
/**
* 將a[begin]放在一個位置,左邊小於a[begin],右邊大於a[begin]
* @param a 數組
* @param begin 起始位置[以此爲標準]
* @param end 結束位置
*/
public static int adjustArray(int []a,int begin,int end){
int tmp = a[begin];
int i=begin,j=end;
while(i<j){
//從右至左找到小於tmp的數,然後a[i]=a[j],調換位置
while(i<j && a[j]>=tmp){
j--;
}
if(a[j]<tmp){
a[i] = a[j];
i++;
}
//從左至右找到大於tmp的數,然後a[j]=a[i],調換位置
while(i<j && a[i]<=tmp){
i++;
}
if(a[i]>tmp){
a[j] = a[i];
j--;
}
}
a[i]=tmp;
return i;
}
/**
* 遞歸將begin位置數字放置正確位置,直至begin=last
* @param a
* @param begin
* @param last
*/
public static void quickSort(int []a,int begin,int last){
if(begin < last){
int i = adjustArray(a, begin, last);
adjustArray(a,begin,i-1);
adjustArray(a, i+1, last);
}
}
public static void main(String[] args) {
int a[] = get_intarr(10000000);
long begin = System.currentTimeMillis();
quickSort(a,0,a.length-1);
long runtime = System.currentTimeMillis()-begin;
System.out.println("排序運行時間:"+runtime);
// show(a);
}
}