在寫快速排序前我們們可以寫一下劃分,劃分的目的是陣列基本有序,怎麼使陣列基本有序?這需要我們提前選乙個值作為樞紐,作為劃分陣列的關鍵值,使大的元素和較小的元素分布在這個樞紐的兩邊,這就需要我們事先對陣列裡元素有乙個大致上的了解。
//劃分演算法
public int parititon(int low, int pivot, int up)
return left;
}
基於劃分演算法,快速排序運用遞迴的方式不斷將原來的陣列進行分割,分割後的陣列又呼叫劃分演算法,直至將陣列全部拍完序。而樞紐每次都取陣列的最右邊的,在呼叫劃分演算法的末尾還需與右邊較大的乙個元素進行交換以得到更加合理的樞紐,其實這並不是一種取樞紐值的好方法,還有一種是三項取樞紐,在排序前對前中後先做一次比較,已得到更加合理的樞紐,大家可以試試只需在下面的**做些小改動
package csnd;
public class quicksort
public quicksort(int max)
public void insert(int j)
public void display()
else
}public int parititon(int low, int pivot, int up)
swap(left,up);//此時在與最右邊的元素交換得到新陣列
return left;
} private void swap(int left, int right)
public static void main(string args)
system.out.println("排序前的陣列");
thearray.display();
system.out.println("排序後的陣列");
thearray.quicksort();
thearray.display();
} }
排序前的陣列
3 9 1 5 2 6 2 0 0 0
排序後的陣列
0 0 0 1 2 2 3 5 6 9
高階排序演算法之雙路快速排序
對於具有大量重複資料的排序按照之前的方式效能會很低,現在我們增加兩個標誌,想辦法把大量重複的資料分到兩部分,例如設定v作為標誌資料,讓等於v的資料分為兩部分,如下圖所示,這樣可以避免兩邊的資料出現一邊倒的情況。根據以上演算法的思想,修改如下 雙路快速排序演算法 解決具有大量重複源資料排序慢的問題 t...
排序之快速排序
快速排序的在內排中起到比較重要的作用,平均時間複雜度達到o nlogn 公升序快速排序 1 int partition vector vi,int start,int end 11 vi start key 12return start 13 14void quickcore vector vi,i...
排序之快速排序
有沒有既不浪費空間又可以快一點的排序演算法呢?那就是 快速排序 啦!光聽這個名字是不是就覺得很高階呢。假設我們現在對 6 1 2 7 9 3 4 5 10 8 這個10個數進行排序。首先在這個序列中隨便找乙個數作為基準數 不要被這個名詞嚇到了,就是乙個用來參照的數,待會你就知道它用來做啥的了 為了方...