日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【数据结构】用java实现不同的七种排序算法和性能比较

發布時間:2024/9/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构】用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
初始步長可以直接決定希爾排序的性能

class Shell{int total;int[] data = new int[10];Shell() {total = 10;Random random = new Random();for (int i = 0; i < 10; i++)data[i] = random.nextInt(100) %60;for (int i = 0; i < 10; i++)System.out.print(data[i]+",");}public void shell_sort(){int temp;int j;int dl = this.total/2;//初始步長while(dl >=1){for(int i = 1+dl;i < total;i++){temp = data[i];j = i-dl;while (j>=0 && data[j] > temp){data[j+dl] =data[j];j = j-dl;if(j < 0) break;}data[j+dl] = temp;}dl = dl/2;}System.out.println("希爾排序后");for (int i = 1; i < total; i++)System.out.print(data[i]+",");}}

結果:
18,29,29,48,12,17,15,0,0,33,希爾排序后
0,0,12,15,17,29,29,33,48,
改數字為十萬后:

3.冒泡排序

每一次都浮上來最小的元素,是穩定的排序算法
以下用exchange作為標記,如果為false表示已經排序完成,可以不再執行下一次循環

class pop{int total = 100000;int[] data = new int[total];pop() {Random random = new Random();for (int i = 0; i < total; i++)data[i] = random.nextInt() % 60000;for (int i = 0; i < total; i++)System.out.print(data[i] + ",");}public void pop_sort() {boolean exchange = false; for(int i = 1;i < total;i++) {for(int j = total-1;j >= i;j--){if(data[j] < data[j-1]){exchange = true;int temp = data[j];data[j]= data[j-1];data[j-1] = temp;}}if(exchange == false) break; }System.out.println("冒泡排序后");for (int i = 1; i < total; i++)System.out.print(data[i]+",");} }

結果:

明顯看出來冒泡排序實在太慢,與希爾排序相比差了有五十倍

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.選擇排序

關鍵思想:每一次都把關鍵字最小或最大的元素放在最終位置上,選擇排序包括堆排序和直接選擇排序
直接選擇排序通過待排子表中完整地比較一遍以確定最大或最小元素,并放在子表的最前面/最后面

class choose{int total = 100000;int[] data = new int[total];choose(){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 void choose_sort(){int min = Integer.MAX_VALUE;for(int i = 0;i < total-1;i++){min = i;for(int j = i+1;j < total;j++){if(data[j] < data[min]){min = j;}}if(min != i){int temp = data[i];data[i] = data[min];data[min] = temp;}}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(); choose choose1 = new choose(); choose1.choose_sort();long now2 = System.currentTimeMillis();System.out.println();System.out.println(now2-now+"ms");}

結果:

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)


代碼:

class Heap{int total = 100000;//Integer n = 100;解析為 Integer num = Integer.valueOf(100);//valueOf(參數)方法其實調用的是 new Integer(100);int[]data= new int[total];Heap(){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 void build(int begin,int end){//建立大根堆//end為最大元素下標//調整數組以begin為根的子樹序列為根,其中最大的元素下標為end//假設以2k和2k+1為根的左右子樹均為堆int i = begin;boolean finished = false;int j = 2*i;int temp = this.data[i];while(j<= end && !finished){if(j+1<=end && this.data[j+1] > this.data[j])j = j+1;//指向左右孩子的最大值if(this.data[i] < this.data[j]){this.data[i] = this.data[j];i = j;j = 2*j;}else finished = true;//如果原根最大,篩選結束}this.data[i] = temp;//原根的值填充到所搜索的當前空位置中}public void heap_sort(){for(int i = (total-1)/2;i>=0;i--){build(i,total-1);//建立初始堆}System.out.println();for(int i = total-1;i>=1;i--){int temp = this.data[0];this.data[0] = this.data[i];this.data[i] = temp;//先輸出根build(0,i-1);//調整子序列data[0..i-1]};System.out.println("堆排序后");for (int i = 0; i < total; i++)System.out.print(data[i]+",");} }public static void main(String[] args) {long now = System.currentTimeMillis(); Heap heap=new Heap(); heap.heap_sort();long now2 = System.currentTimeMillis();System.out.println();System.out.println(now2-now+"ms");}

結果:

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实现不同的七种排序算法和性能比较的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲精品中文字幕在线 | 区一区二视频 | 亚洲激情综合 | 国产精品igao视频 | 亚洲欧美日本国产 | 日本69av| 国产一级色 | 嫩草影院懂你的影院 | 五月婷婷综合激情 | 中国性老太hd大全69 | 久久天天躁狠狠躁夜夜av | 精品国产乱码久久久久久预案 | 亚洲无套 | yes4444视频在线观看 | 丰满熟女人妻一区二区三 | 亚洲www| 午夜天堂在线 | 五月天婷婷视频 | 羞羞动漫免费观看 | 伊人草草 | 日韩免费在线观看视频 | 久久久久久久美女 | 99久久久久成人国产免费 | 精品中出 | 男人的天堂视频网站 | 在线视频激情小说 | 毛片网站免费观看 | 成av人在线观看 | 337p亚洲精品色噜噜噜 | 夜夜春夜夜爽 | 女性向片在线观看 | 麻豆视频在线观看 | 欧美成人免费视频 | 男女互操视频 | 日本三区视频 | 潘甜甜在线 | 一级在线免费观看 | 亚洲欧美激情另类 | 亚洲免费观看av | 99久久婷婷国产综合精品电影 | 久久艹在线 | 亚洲国产成人久久 | 欧美大片在线看免费观看 | 土耳其xxxx性hd极品 | 欧美一区二区三区久久久 | 四虎黄色网 | 国产成人精品亚洲线观看 | 午夜激情免费 | a天堂资源 | 嫩模一区 | 久久精品高清 | 手机av在线免费观看 | 亚洲欧美高清视频 | 制服诱惑一区二区三区 | 日韩伦人妻无码 | 成人做受黄大片 | 日韩插| 医生强烈淫药h调教小说视频 | 女人黄色片 | 欧美性免费 | 国产欧美一区二区三区精品酒店 | 中国精品久久久 | 韩国一区二区三区四区 | 四虎影视库 | 亚洲国产网址 | 视频精品一区二区 | 亚洲av永久中文无码精品综合 | 亚洲精品久久久久av无码 | 欧美群交射精内射颜射潮喷 | 国产色在线,com | av无码久久久久久不卡网站 | 内射一区二区三区 | 精品国产乱码久久久久久108 | 久久激情网 | 神马午夜我不卡 | 毛片在哪看 | 精品黄色在线观看 | 中国久久久久 | 在线观看天堂av | 日日夜夜爽爽 | 欧美日韩三级 | 2024国产精品视频 | 日韩在线视频免费看 | 国产精品久久久久久久久久久新郎 | 白浆av| 强行侵犯视频在线观看 | 国产伦精品一区二区三区四区免费 | 成人资源在线观看 | 伊人色av | 樱花影院电视剧免费 | 最近最新中文字幕 | www视频免费在线观看 | 禁漫天堂黄漫画无遮挡观看 | 先锋av在线资源 | aa亚洲 | 噜噜狠狠狠狠综合久久 | 国产裸体美女永久免费无遮挡 | 日日夜夜免费视频 | 无码精品a∨在线观看中文 福利片av |