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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java数据结构与算法:排序算法

發(fā)布時(shí)間:2025/4/16 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java数据结构与算法:排序算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 冒泡排序

冒泡排序(Bubble Sort),又被稱為氣泡排序或泡沫排序。

它是一種較簡單的排序算法。它會(huì)遍歷若干次要排序的數(shù)列,每次遍歷時(shí),它都會(huì)從前往后依次的比較相鄰兩個(gè)數(shù)的大小;如果前者比后者大,則交換它們的位置。這樣,一次遍歷之后,最大的元素就在數(shù)列的末尾! 采用相同的方法再次遍歷時(shí),第二大的元素就被排列在最大元素之前。重復(fù)此操作,直到整個(gè)數(shù)列都有序?yàn)橹?#xff01;

相鄰元素兩兩比較,大的往后放,第一次完畢,最大值出現(xiàn)在了最大索引處

/** 冒泡排序基本概念是:* 依次比較相鄰的兩個(gè)數(shù),將小數(shù)放在前面,大數(shù)放在后面。* 即在第一趟:首先比較第1個(gè)和第2個(gè)數(shù),將小數(shù)放前,大數(shù)放后。* 然后比較第2個(gè)數(shù)和第3個(gè)數(shù),將小數(shù)放前,大數(shù)放后,如此繼續(xù),* 直至比較最后兩個(gè)數(shù),將小數(shù)放前,大數(shù)放后。至此第一趟結(jié)束,* 將最大的數(shù)放到了最后。在第二趟:仍從第一對(duì)數(shù)開始比較* (因?yàn)榭赡苡捎诘?個(gè)數(shù)和第3個(gè)數(shù)的交換,使得第1個(gè)數(shù)不再小于第2個(gè)數(shù)),* 將小數(shù)放前,大數(shù)放后,一直比較到倒數(shù)第二個(gè)數(shù)(倒數(shù)第一的位置上已經(jīng)是最大的),* 第二趟結(jié)束,在倒數(shù)第二的位置上得到一個(gè)新的最大數(shù)* (其實(shí)在整個(gè)數(shù)列中是第二大的數(shù))。如此下去,重復(fù)以上過程,直至最終完成排序。 */ public void bubbleSort(int[] arr){for (int i = 0; i < arr.length-1; i++) {for (int j = 0; j < arr.length-1-i; j++) {if (array[j] > array[j+1]){int temp = array[j];array[j] = array[j+1];array[j+1] = temp;}}} }

下面以數(shù)列{20,40,30,10,60,50}為例,演示它的冒泡排序過程

我們先分析第1趟排序
當(dāng)i=5,j=0時(shí),a[0]

1.1 冒泡排序的時(shí)間復(fù)雜度和穩(wěn)定性

1.1.1 冒泡排序時(shí)間復(fù)雜度

冒泡排序的時(shí)間復(fù)雜度是O(N2)。
假設(shè)被排序的數(shù)列中有N個(gè)數(shù)。遍歷一趟的時(shí)間復(fù)雜度是O(N),需要遍歷多少次呢?N-1次!因此,冒泡排序的時(shí)間復(fù)雜度是O(N2)。

1.1.2 冒泡排序穩(wěn)定性

冒泡排序是穩(wěn)定的算法,它滿足穩(wěn)定算法的定義。
算法穩(wěn)定性 – 假設(shè)在數(shù)列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。則這個(gè)排序算法是穩(wěn)定的!

public class BubbleSort {/** 冒泡排序** 參數(shù)說明:* a -- 待排序的數(shù)組* n -- 數(shù)組的長度*/public static void bubbleSort1(int[] a, int n) {int i,j;for (i=n-1; i>0; i--) {// 將a[0...i]中最大的數(shù)據(jù)放在末尾for (j=0; j<i; j++) {if (a[j] > a[j+1]) {// 交換a[j]和a[j+1]int tmp = a[j];a[j] = a[j+1];a[j+1] = tmp;}}}}/** 冒泡排序(改進(jìn)版)** 參數(shù)說明:* a -- 待排序的數(shù)組* n -- 數(shù)組的長度*/public static void bubbleSort2(int[] a, int n) {int i,j;int flag; // 標(biāo)記for (i=n-1; i>0; i--) {flag = 0; // 初始化標(biāo)記為0// 將a[0...i]中最大的數(shù)據(jù)放在末尾for (j=0; j<i; j++) {if (a[j] > a[j+1]) {// 交換a[j]和a[j+1]int tmp = a[j];a[j] = a[j+1];a[j+1] = tmp;flag = 1; // 若發(fā)生交換,則設(shè)標(biāo)記為1}}if (flag==0)break; // 若沒發(fā)生交換,則說明數(shù)列已有序。}}public static void main(String[] args) {int i;int[] a = {20,40,30,10,60,50};System.out.printf("before sort:");for (i=0; i<a.length; i++)System.out.printf("%d ", a[i]);System.out.printf("\n");bubbleSort1(a, a.length);//bubbleSort2(a, a.length);System.out.printf("after sort:");for (i=0; i<a.length; i++)System.out.printf("%d ", a[i]);System.out.printf("\n");} }

2. 選擇排序

從0索引開始,依次和后面元素比較,小的往前放,第一次完畢,最小值出現(xiàn)在了最小索引處

/** 選擇排序基本思路:* 把第一個(gè)元素依次和后面的所有元素進(jìn)行比較。* 第一次結(jié)束后,就會(huì)有最小值出現(xiàn)在最前面。* 依次類推*/ public void selectSort(int[] arr){for (int i = 0; i < arr.length-1; i++) {for (int j = i+1; j < arr.length; j++) {if (arr[j] < arr[i]){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}} }

3. 插入排序

排序思想:第二個(gè)數(shù)據(jù)依次往前比較,如果發(fā)現(xiàn)比自己大,該數(shù)據(jù)往后瞬移,否則該數(shù)據(jù)插入找到數(shù)據(jù)的后面

/** 插入排序基本思想* 將n個(gè)元素的數(shù)列分為已有序和無序兩個(gè)部分,如插入排序過程示例下所示:   * {{a1},{a2,a3,a4,…,an}}   * {{a1⑴,a2⑴},{a3⑴,a4⑴ …,an⑴}}  * {{a1(n-1),a2(n-1) ,…},{an(n-1)}}   * 每次處理就是將無序數(shù)列的第一個(gè)元素與有序數(shù)列的元素從后往前逐個(gè)進(jìn)行比較,* 找出插入位置,將該元素插入到有序數(shù)列的合適位置中。*/ public class AlogrithmApp {/*** @param number* @return 1 到nubmer的和*/public static int sum(int number) {if (number < 1) {throw new RuntimeException("number must > 0");}if (number == 1) {return 1;} else {return number + sum(number - 1);}}private static int counts = 0;public static void moveNumber(int panNum, char a, char b, char c) {counts++;if (panNum != 1) {moveNumber(panNum - 1, a, c, b);moveNumber(panNum - 1, b, a, c);}}public static void move(int panNum, char a, char b, char c) {if (panNum == 1) {System.out.println("盤:" + panNum + " 從 " + a + " 柱移動(dòng) " + c + " 柱");} else {move(panNum - 1, a, c, b);System.out.println("盤:" + panNum + " 從 " + a + " 柱移動(dòng) " + c + " 柱");move(panNum - 1, b, a, c);}}/*** @param args*/public static void main(String[] args) {/*moveNumber(30, 'a', 'b', 'c');System.out.println(counts);*/int datas[] = new int[100000]; //初始化數(shù)據(jù) initData(datas); //打印數(shù)據(jù)//printData(datas); //插入排序 quickSort(datas, 0, datas.length-1);System.out.println(System.currentTimeMillis());insertSort(datas); //排序后打印 //printData(datas);System.out.println(System.currentTimeMillis());}public static void selectSort(int[] datas) {for (int i = 0; i < datas.length - 1; i++) {int minIndex = i;// 最小數(shù)據(jù)的下標(biāo)for (int j = i + 1; j < datas.length; j++) {if (datas[minIndex] > datas[j]) {minIndex = j;}}int temp = datas[i];datas[i] = datas[minIndex];datas[minIndex] = temp;}}/*** 初始化數(shù)據(jù)* * @param datas*/public static void initData(int datas[]) {for (int i = 0; i < datas.length; i++) {// 隨機(jī)1到100的值datas[i] = (int) (Math.random() * 100) + 1;}}/*** 打印數(shù)據(jù)* * @param datas*/public static void printData(int datas[]) {for (int i = 0; i < datas.length; i++) {System.out.print(datas[i] + ",");}System.out.println();}public static void bubbleSort(int datas[]) {int j = 0; // 冒泡的次數(shù)int i = 0; // 每次冒泡的比較for (j = datas.length - 1; j > 0; j--) {for (i = 0; i < j; i++) {if (datas[i] > datas[i + 1]) {int temp = datas[i];datas[i] = datas[i + 1];datas[i + 1] = temp;}}}}public static void insertSort(int datas[]) {int j = 0; // 第二個(gè)數(shù)據(jù)開始插入的下標(biāo)int i = 0;// 插入的次數(shù)for (i = 1; i < datas.length; i++) {int temp = datas[i];for (j = i - 1; j >= 0; j--) {if (datas[j] > temp) {datas[j + 1] = datas[j];} else {break;}}// 判斷 j == -1 或者 就是第一個(gè)小于等于temp數(shù)據(jù)的位置datas[j + 1] = temp;}}/*** 快速排序* * @param datas*/public static void quickSort(int datas[], int start, int end) {if (start >= end) {return;} else {int middle = findMiddle(datas, start, end);quickSort(datas, start, middle - 1);quickSort(datas, middle + 1, end);}}private static int findMiddle(int datas[], int start, int end) {int temp = datas[end];// 參照物int left = start - 1;int right = end;while (true) {// 1.從左邊依次找數(shù)據(jù),找到第一個(gè)比參照大的數(shù)據(jù)while (++left < end && datas[left] <= temp);if (left == end) {//參照物是最大值break;}// 2.從右邊依次找數(shù)據(jù),找到第一個(gè)比參數(shù)小的數(shù)據(jù)while (--right >= start && datas[right] >= temp);// 3. 比較是否出現(xiàn)交叉(left 和 right)if (left < right) {// 4. 如果沒有交叉,交換左右指針位置的數(shù)據(jù)int d = datas[left];datas[left] = datas[right];datas[right] = d;} else {// 5. 如果出現(xiàn)交叉,交換左指針和參照物的值,結(jié)束int d = datas[left];datas[left] = datas[end];datas[end] = d;break;}}return left;}}

4. 快速排序

快速排序(Quick Sort)使用分治法策略。它的基本思想是:選擇一個(gè)基準(zhǔn)數(shù),通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分;其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小。然后,再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。

快速排序流程:

  • 從數(shù)列中挑出一個(gè)基準(zhǔn)值。
  • 將所有比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊);在這個(gè)分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。
  • 遞歸地把”基準(zhǔn)值前面的子數(shù)列”和”基準(zhǔn)值后面的子數(shù)列”進(jìn)行排序。

選擇一個(gè)基準(zhǔn)數(shù),通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分;其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小。然后,再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。

package cn.itcast;/** 快速排序:* 一趟快速排序的算法是:   * 1)設(shè)置兩個(gè)變量i、j,排序開始的時(shí)候:i=0,j=N-1;   * 2)以第一個(gè)數(shù)組元素作為關(guān)鍵數(shù)據(jù),賦值給key,即 key=A[0];   * 3)從j開始向前搜索,即由后開始向前搜索(j=j-1即j--),* 找到第一個(gè)小于key的值A(chǔ)[j],A[i]與A[j]交換;   * 4)從i開始向后搜索,即由前開始向后搜索(i=i+1即i++),* 找到第一個(gè)大于key的A[i],A[i]與A[j]交換;   * 5)重復(fù)第3、4、5步,直到 I=J; * (3,4步是在程序中沒找到時(shí)候j=j-1,i=i+1,直至找到為止。* 找到并交換的時(shí)候i, j指針位置不變。* 另外當(dāng)i=j這過程一定正好是i+或j-完成的最后令循環(huán)結(jié)束。) */ public class QuickSort {public static void sort(int[] data) {quickSort(data, 0, data.length - 1);}private static void quickSort(int[] data, int i, int j) {int pivotIndex = (i + j) / 2;// swapSortTest.swap(data, pivotIndex, j);int k = partition(data, i - 1, j, data[j]);SortTest.swap(data, k, j);if ((k - i) > 1)quickSort(data, i, k - 1);if ((j - k) > 1)quickSort(data, k + 1, j);}/*** @param data* @param i* @param j* @return*/private static int partition(int[] data, int l, int r, int pivot) {do {while (data[++l] < pivot);while ((r != 0) && data[--r] > pivot);SortTest.swap(data, l, r);} while (l < r);SortTest.swap(data, l, r);return l;} } /*** 快速排序** 參數(shù)說明:* a -- 待排序的數(shù)組* l -- 數(shù)組的左邊界(例如,從起始位置開始排序,則l=0)* r -- 數(shù)組的右邊界(例如,排序截至到數(shù)組末尾,則r=a.length-1)*/ public static void quickSort(int[] a, int l, int r) {if (l < r) {int i, j, x;i = l;j = r;x = a[i];while (i < j) {while (i < j && a[j] > x)j--; // 從右向左找第一個(gè)小于x的數(shù)if (i < j)a[i++] = a[j];while (i < j && a[i] < x)i++; // 從左向右找第一個(gè)大于x的數(shù)if (i < j)a[j--] = a[i];}a[i] = x;quickSort(a, l, i - 1); /* 遞歸調(diào)用 */quickSort(a, i + 1, r); /* 遞歸調(diào)用 */} }

下面以數(shù)列a={30,40,60,10,20,50}為例,演示它的快速排序過程

上圖只是給出了第1趟快速排序的流程。在第1趟中,設(shè)置x=a[i],即x=30。
(01) 從”右 –> 左”查找小于x的數(shù):找到滿足條件的數(shù)a[j]=20,此時(shí)j=4;然后將a[j]賦值a[i],此時(shí)i=0;接著從左往右遍歷。
(02) 從”左 –> 右”查找大于x的數(shù):找到滿足條件的數(shù)a[i]=40,此時(shí)i=1;然后將a[i]賦值a[j],此時(shí)j=4;接著從右往左遍歷。
(03) 從”右 –> 左”查找小于x的數(shù):找到滿足條件的數(shù)a[j]=10,此時(shí)j=3;然后將a[j]賦值a[i],此時(shí)i=1;接著從左往右遍歷。
(04) 從”左 –> 右”查找大于x的數(shù):找到滿足條件的數(shù)a[i]=60,此時(shí)i=2;然后將a[i]賦值a[j],此時(shí)j=3;接著從右往左遍歷。
(05) 從”右 –> 左”查找小于x的數(shù):沒有找到滿足條件的數(shù)。當(dāng)i>=j時(shí),停止查找;然后將x賦值給a[i]。此趟遍歷結(jié)束!

按照同樣的方法,對(duì)子數(shù)列進(jìn)行遞歸遍歷。最后得到有序數(shù)組!

4.1 快速排序的時(shí)間復(fù)雜度和穩(wěn)定性

4.1.2 快速排序穩(wěn)定性

快速排序是不穩(wěn)定的算法,它不滿足穩(wěn)定算法的定義。
算法穩(wěn)定性 – 假設(shè)在數(shù)列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。則這個(gè)排序算法是穩(wěn)定的!

4.1.3 快速排序時(shí)間復(fù)雜度

快速排序的時(shí)間復(fù)雜度在最壞情況下是O(N2),平均的時(shí)間復(fù)雜度是O(N*lgN)。
這句話很好理解:假設(shè)被排序的數(shù)列中有N個(gè)數(shù)。遍歷一次的時(shí)間復(fù)雜度是O(N),需要遍歷多少次呢?至少lg(N+1)次,最多N次。
(01) 為什么最少是lg(N+1)次?快速排序是采用的分治法進(jìn)行遍歷的,我們將它看作一棵二叉樹,它需要遍歷的次數(shù)就是二叉樹的深度,而根據(jù)完全二叉樹的定義,它的深度至少是lg(N+1)。因此,快速排序的遍歷次數(shù)最少是lg(N+1)次。
(02) 為什么最多是N次?這個(gè)應(yīng)該非常簡單,還是將快速排序看作一棵二叉樹,它的深度最大是N。因此,快讀排序的遍歷次數(shù)最多是N次。

5. 堆排序

堆排序利用了大根堆(或小根堆)堆頂記錄的關(guān)鍵字最大(或最小)這一特征, 使得在當(dāng)前無序區(qū)中選取最大(或最小)關(guān)鍵字的記錄變得簡單

5.1 用大根堆排序的基本思想   

  • 先將初始文件R[1..n]建成一個(gè)大根堆,此堆為初始的無序區(qū)   
  • 再將關(guān)鍵字最大的記錄R[1](即堆頂)和無序區(qū)的最后一個(gè) 記錄R[n]交換,由此得到新的無序區(qū)R[1..n-1]和有序區(qū)R[n],
    且滿足R[1..n-1].keys≤R[n].key   
  • 由于交換后新的根R[1]可能違反堆性質(zhì),故應(yīng)將當(dāng)前無序區(qū)R[1..n-1]調(diào)整為堆。
    然后再次將R[1..n-1]中關(guān)鍵字最大的記錄R[1]和該區(qū)間的最后一個(gè)記錄R[n-1]交換,
    由此得到新的無序區(qū)R[1..n-2]和有序區(qū)R[n-1..n],
    且仍滿足關(guān)系R[1..n-2].keys≤R[n-1..n].keys,同樣要將R[1..n-2]調(diào)整為堆。  
    直到無序區(qū)只有一個(gè)元素為止。   

5.2 大根堆排序算法的基本操作

  • 初始化操作:將R[1..n]構(gòu)造為初始堆
  • 每一趟排序的基本操作:將當(dāng)前無序區(qū)的堆頂記錄R[1]和該區(qū)間的最后一個(gè)記錄交換, 然后將新的無序區(qū)調(diào)整為堆(亦稱重建堆)
package cn.itcast;public class HeapSort {public static void sort(int[] data) {MaxHeap h = new MaxHeap();h.init(data);for (int i = 0; i < data.length; i++)h.remove();System.arraycopy(h.queue, 1, data, 0, data.length);}private static class MaxHeap {void init(int[] data) {this.queue = new int[data.length + 1];for (int i = 0; i < data.length; i++) {queue[++size] = data[i];fixUp(size);}}private int size = 0;private int[] queue;public int get() {return queue[1];}public void remove() {SortTest.swap(queue, 1, size--);fixDown(1);}// fixdownprivate void fixDown(int k) {int j;while ((j = k << 1) <= size) {if (j < size && queue[j] < queue[j + 1])j++;if (queue[k] > queue[j]) // 不用交換break;SortTest.swap(queue, j, k);k = j;}}private void fixUp(int k) {while (k > 1) {int j = k >> 1;if (queue[j] > queue[k])break;SortTest.swap(queue, j, k);k = j;}}} }

6. 歸并排序

package cn.itcast;/** 歸并操作(merge),也叫歸并算法,指的是將兩個(gè)已經(jīng)排序的序列合并成一個(gè)序列的操作。   * 如設(shè)有數(shù)列{6,202,100,301,38,8,1}   * 初始狀態(tài): [6] [202] [100] [301] [38] [8] [1] 比較次數(shù)   * i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3   * i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4   * i=3 [ 1 6 8 38 100 202 301 ] 4 */ public class MergeSort {public static void sort(int[] data) {int[] temp = new int[data.length];mergeSort(data, temp, 0, data.length - 1);}private static void mergeSort(int[] data, int[] temp, int l, int r) {int mid = (l + r) / 2;if (l == r)return;mergeSort(data, temp, l, mid);mergeSort(data, temp, mid + 1, r);for (int i = l; i <= r; i++) {temp[i] = data[i];}int i1 = l;int i2 = mid + 1;for (int cur = l; cur <= r; cur++) {if (i1 == mid + 1)data[cur] = temp[i2++];else if (i2 > r)data[cur] = temp[i1++];else if (temp[i1] < temp[i2])data[cur] = temp[i1++];elsedata[cur] = temp[i2++];}} }

7. 希爾排序

package cn.itcast;/** 希爾排序:先取一個(gè)小于n的整數(shù)d1作為第一個(gè)增量,* 把文件的全部記錄分成(n除以d1)個(gè)組。所有距離為d1的倍數(shù)的記錄放在同一個(gè)組中。* 先在各組內(nèi)進(jìn)行直接插入排序;然后,取第二個(gè)增量d2<d1重復(fù)上述的分組和排序,* 直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有記錄放在同一組中進(jìn)行直接插入排序?yàn)橹埂?*/ public class ShellSort {public static void sort(int[] data) {for (int i = data.length / 2; i > 2; i /= 2) {for (int j = 0; j < i; j++) {insertSort(data, j, i);}}insertSort(data, 0, 1);}/*** @param data* @param j* @param i*/private static void insertSort(int[] data, int start, int inc) {for (int i = start + inc; i < data.length; i += inc) {for (int j = i; (j >= inc) && (data[j] < data[j - inc]); j -= inc) {SortTest.swap(data, j, j - inc);}}} } /** 屬于插入類排序,是將整個(gè)無序列分割成若干小的子序列分別進(jìn)行插入排序    * 排序過程:先取一個(gè)正整數(shù)d1<n,把所有序號(hào)相隔d1的數(shù)組元素放一組,* 組內(nèi)進(jìn)行直接插入排序;然后取d2<d1,重復(fù)上述分組和排序操作;直至di=1, 即所有記錄放進(jìn)一個(gè)組中排序?yàn)橹?   * 初始:d=5   49 38 65 97 76 13 27 49 55 04    * 49 13   |-------------------|    * 38 27 |-------------------|    * 65 49   |-------------------|    * 97 55 |-------------------|    * 76 04   |-------------------|    * 一趟結(jié)果   13 27 49 55 04 49 38 65 97 76    * d=3    13 27 49 55 04 49 38 65 97 76    * 13 55 38 76 |------------|------------|------------|    * 27 04 65 |------------|------------|    * 49 49 97 |------------|------------|   * 二趟結(jié)果 13 04 49* 38 27 49 55 65 97 76    * d=1   13 04 49 38 27 49 55 65 97 76*    |----|----|----|----|----|----|----|----|----|    三趟結(jié)果   * 04 13 27 38 49 49 55 65 76 97*/ package cn.itcast;import java.util.Arrays;public class SortTest {public static void main(String[] args) {int[] arr = { 2, 5, 3, 1, 4 };System.out.println("排序前:" + Arrays.toString(arr));// InsertSort.sort(arr);// BubbleSort.sort(arr);// SelectionSort.sort(arr);// ShellSort.sort(arr);// QuickSort.sort(arr);// MergeSort.sort(arr);// HeapSort.sort(arr);System.out.println("排序后:" + Arrays.toString(arr));}/** 交換數(shù)組中的兩個(gè)元素*/public static void swap(int[] data, int i, int j) {int temp = data[i];data[i] = data[j];data[j] = temp;} }

7. 面試中的排序算法總結(jié)

總結(jié)

以上是生活随笔為你收集整理的Java数据结构与算法:排序算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。