【数据结构】用java实现不同的七种排序算法和性能比较
文章目錄
- 1.直接插入排序
- 2.希爾排序
- 3.冒泡排序
- 4.快速排序
- 5.選擇排序
- 6.堆排序
- 7.歸并排序
1.直接插入排序
public class DifferentSort {public static void main(String[] args) {Insert insert = new Insert();insert.sort();} } class Insert {int total;int[] data = new int[10];Insert() {Random random = new Random();for (int i = 0; i < 10; i++)data[i] = random.nextInt() %100;}void sort() {total = 10;int j;int temp;for (int i = 1; i < total; i++) {temp = this.data[i];j = i - 1;// System.out.println(j);while (data[j] > temp && j >=0) {data[j+1] = data[j];j--;if(j < 0) break;}data[j+1] = temp;}for (int i = 1; i < total; i++)System.out.println(data[i]);} }
2.希爾排序
插入排序的改進版,插入排序當序列為正序或基本有序時時間復雜度為o(n),希爾排序的基本思想:待排序列劃分為若干組,每組內進行直接插入排序,然后再對整個序列直接排序
步長的變化:1<dl<=n/2
初始步長可以直接決定希爾排序的性能
結果:
18,29,29,48,12,17,15,0,0,33,希爾排序后
0,0,12,15,17,29,29,33,48,
改數字為十萬后:
3.冒泡排序
每一次都浮上來最小的元素,是穩定的排序算法
以下用exchange作為標記,如果為false表示已經排序完成,可以不再執行下一次循環
結果:
明顯看出來冒泡排序實在太慢,與希爾排序相比差了有五十倍
4.快速排序
首先選一個元素作為中間元素,然后對兩邊進行同樣的操作,遞歸進行
class Quick{Integer partion;int total = 10000;//Integer n = 100;解析為 Integer num = Integer.valueOf(100);//valueOf(參數)方法其實調用的是 new Integer(100);int[]data= new int[total];int n = 0;Quick(){Random random = new Random();for (int i = 0; i < total; i++)data[i] = random.nextInt(1000) %1000;for (int i = 0; i < total; i++)System.out.print(data[i]+",");}public Integer getN(){return this.n;}public Integer get(){return this.total;}public int part(int begin,int end){int temp;temp = data[begin];int i = begin,j = end;while (i != j){while(i <j &&data[j] > temp) {j--;}if(i < j){data[i] = data[j];//data[j]填補到空位中,交換i++;}while (data[i] < temp && i < j){i++;}if(i < j){data[j] = data[i];j--;//填補到后面的空位中}}data[i] = temp;//最終temp的位置return i;}public void Quick_sort(int n,int total){// Integer i = new Integer(10);if(n < total){int partnum = part(n,total);Quick_sort(n,partnum-1);Quick_sort(partnum+1,total);}else {return;}}public void display(){System.out.println("快速排序后");for (int i = 1; i < total; i++)System.out.print(data[i]+",");} }public static void main(String[] args) {long now = System.currentTimeMillis(); Quick quick = new Quick();quick.Quick_sort(quick.getN(),quick.get()-1); quick.display(); long now2 = System.currentTimeMillis();System.out.println();System.out.println(now2-now+"ms");}排十萬個數字:
目前的話看得出快速排序比希爾排序更快,性能是最好的。
另外在這里嘗試了用Integer,發現會導致程序死循環,原因還未查明,應該跟它的數字范圍有關
5.選擇排序
關鍵思想:每一次都把關鍵字最小或最大的元素放在最終位置上,選擇排序包括堆排序和直接選擇排序
直接選擇排序通過待排子表中完整地比較一遍以確定最大或最小元素,并放在子表的最前面/最后面
結果:
6.堆排序
可以分兩種情況分別討論
①如果初始序列是堆,則可通過反復執行如下操作而最終得到一個有序序列
輸出根:即將根(第一個元素)與當前子序列中的最后一個元素交換。
調整堆:將輸出根之后的子序列調整為堆(元素個數比輸出前少1個)元
②如果初始序列不是堆,則首先要將其先建成堆然后再按①的方式來實現
現在的問題是:如何由一個無序序列建成一個堆?
事實上,由無序序列建堆可通過反復調用篩選作來實現。為此需滿足篩選的條件,即左右子樹必須為堆。因此,建堆過程要從下往上逐子樹地進行篩選。從易于編程的角度出發,根的下標自然是按從大到小,即按照根的下標從2到1的次序調整各子樹為堆。
由初始序列(12,15,30,80,100,46,78,3390,86,64,55,120,230,45)建堆的過程如圖11-9所示。
最終得到的堆:
(230,100,120,90,86,55,7833,80,15,64,12,46,30,45)
代碼:
結果:
7.歸并排序
public static void main(String[] args) {long now = System.currentTimeMillis(); Merge merge = new Merge(); merge.merge_operation(0,merge.get()-1);System.out.println();for (int i = 0; i < merge.get(); i++)System.out.print(merge.data[i]+","); long now2 = System.currentTimeMillis();System.out.println();System.out.println(now2-now+"ms");} class Merge{int total = 100000;public int[]data= new int[total];Merge(){Random random = new Random();for (int i = 0; i < total; i++)data[i] = random.nextInt(10000) %10000;for (int i = 0; i < total; i++)System.out.print(data[i]+",");}public Integer get(){return this.total;}public void merge(int low, int mid, int high){int i = low;int j = mid + 1;int []tmp = new int[high - low +1];//分配足夠空間int k = 0;while(j <= high && i <= mid){if(data[i] >data[j]){tmp[k++] = data[j++];}else tmp[k++] = data[i++];}while(j <= high)tmp[k++] = data[j++];while(i <= mid)tmp[k++] = data[i++];for(int k1 = 0;k1 < k;k1++)data[low+k1] = tmp[k1];}public void merge_operation(int low,int high) {if (low < high) {int mid =(low + high)/2;merge_operation(low,mid);merge_operation(mid+1,high);merge(low,mid,high);}} }結果
還是比較快的,時間復雜度是o(nlogn)
總結
以上是生活随笔為你收集整理的【数据结构】用java实现不同的七种排序算法和性能比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【spring相关面试题摘录】
- 下一篇: 【项目】itdage-java获取天气和