1. 程式人生 > >Java之常見的幾種排序演算法-插入、選擇、冒泡、快排、堆排等

Java之常見的幾種排序演算法-插入、選擇、冒泡、快排、堆排等

Java面試寶典系列之基礎排序演算法

作者:egg

郵箱:[email protected]

本文就是介紹一些常見的排序演算法。排序是一個非常常見的應用場景,很多時候,我們需要根據自己需要排序的資料型別,來自定義排序演算法,但是,在這裡,我們只介紹這些基礎排序演算法,包括:插入排序、選擇排序、氣泡排序、快速排序(重點)、堆排序、歸併排序等等。看下圖:


給定陣列:int data[] = {9,2,7,19,100,97,63,208,55,78}

一、直接插入排序(內部排序、O(n2)、穩定)

原理:從待排序的數中選出一個來,插入到前面的合適位置。

  1. package com.xtfggef.algo.sort;  
  2. publicclass InsertSort {  
  3.     staticint data[] = { 9271910097632085578 };  
  4.     publicstaticvoid insertSort() {  
  5.         int tmp, j = 0;  
  6.         for (int k = 0; k < data.length; k++) {//-----1-----
  7.             tmp = data[k];  
  8.             j = k - 1
    ;  
  9.             while (j >= 0 && tmp < data[j]) {//-----2-----
  10.                 data[j + 1] = data[j];  
  11.                 j--;  
  12.             }  
  13.             data[j + 1] = tmp;//------3-------
  14.         }  
  15.     }  
  16.     publicstaticvoid main(String[] args) {  
  17.         print();  
  18.         System.out.println();  
  19.         insertSort();  
  20.         System.out.println();  
  21.         print();  
  22.     }  
  23.     staticvoid print() {  
  24.         for (int i = 0; i < data.length; i++) {  
  25.             System.out.print(data[i] + " ");  
  26.         }  
  27.     }  
  28. }  
我簡單的講解一下過程:思路上從待排序的資料中選出一個,插入到前面合適的位置,耗時點在插入方面,合適的位置意味著我們需要進行比較找出哪是合適的位置,舉個例子:對於9,2,7,19,100,97,63,208,55,78這組數,第一個數9前面沒有,不做操作,當第一個數完後,剩下的數就是待排序的數,我們將要從除去9開始的書中選出一個插入到前面合適的位置,拿到2後,放在tmp上,進行註釋中的2處的程式碼,2處的程式碼就是通過迴圈找出這個合適的位置,發現比tmp大的數,立即將該數向後移動一位(這樣做的目的是:前面需要空出一位來進行插入),最後通過註釋3處的程式碼將數插入。

本排序適合:基本有序的資料

二、選擇排序(O(n2)、不穩定)
與直接插入排序正好相反,選擇排序是從待排序的數中選出最小的放在已經排好的後面,這個演算法選數耗時。

  1. package com.xtfggef.algo.sort;  
  2. publicclass SelectSort {  
  3.     staticint data[] = { 9271910097632085578 };  
  4.     publicstaticvoid selectSort() {  
  5.         int i, j, k, tmp = 0;  
  6.         for (i = 0; i < data.length - 1; i++) {  
  7.             k = i;  
  8.             for (j = i + 1; j < data.length; j++)  
  9.                 if (data[j] < data[k])  
  10.                     k = j;  
  11.             if (k != i) {  
  12.                 tmp = data[i];  
  13.                 data[i] = data[k];  
  14.                 data[k] = tmp;  
  15.             }  
  16.         }  
  17.     }  
  18.     publicstaticvoid main(String[] args) {  
  19.         print();  
  20.         System.out.println();  
  21.         selectSort();  
  22.         System.out.println();  
  23.         print();  
  24.     }  
  25.     staticvoid print() {  
  26.         for (int i = 0; i < data.length; i++) {  
  27.             System.out.print(data[i] + " ");  
  28.         }  
  29.     }  
  30. }  
通過迴圈,找出最小的數的下標,賦值於k,即k永遠保持待排序資料中最小的數的下標,最後和當前位置i互換資料即可。

三、快速排序(O(nlogn)、不穩定)

快速排序簡稱快排,是一種比較快的排序,適合基本無序的資料,為什麼這麼說呢?下面我說下快排的思路:

設定兩個指標:i和j,分別指向第一個和最後一個,i像後移動,j向前移動,選第一個數為標準(一般這樣做,當然快排的關鍵就是這個“標準”的選取),從後面開始,找到第一個比標準小的數,互換位置,然後再從前面,找到第一個比標準大的數,互換位置,第一趟的結果就是標準左邊的都小於標準,右邊的都大於標準(但不一定有序),分成兩撥後,繼續遞迴的使用上述方法,最終有序!程式碼如下:

  1. package com.xtfggef.algo.sort;  
  2. publicclass QuickSortTest {  
  3.     staticclass QuickSort {  
  4.         publicint data[];  
  5.         privateint partition(int array[], int low, int high) {  
  6.             int key = array[low];  
  7.             while (low < high) {  
  8.                 while (low < high && array[high] >= key)  
  9.                     high--;  
  10.                 array[low] = array[high];  
  11.                 while (low < high && array[low] <= key)  
  12.                     low++;  
  13.                 array[high] = array[low];  
  14.             }  
  15.             array[low] = key;  
  16.             return low;  
  17.         }  
  18.         publicint[] sort(int low, int high) {  
  19.             if (low < high) {  
  20.                 int result = partition(data, low, high);  
  21.                 sort(low, result - 1);  
  22.                 sort(result + 1, high);  
  23.             }  
  24.             return data;  
  25.         }  
  26.     }  
  27.     staticvoid print(int data[]) {  
  28.         for (int i = 0; i < data.length; i++) {  
  29.             System.out.print(data[i] + " ");  
  30.         }  
  31.     }  
  32.     publicstaticvoid main(String[] args) {  
  33.         int data[] = { 

    相關推薦

    Java常見排序演算法-插入選擇冒泡 .

    本文就是介紹一些常見的排序演算法。排序是一個非常常見的應用場景,很多時候,我們需要根據自己需要排序的資料型別,來自定義排序演算法,但是,在這裡,我們只介紹這些基礎排序演算法,包括:插入排序、選擇排序、氣泡排序、快速排序(重點)、堆排序、歸併排序等等。看下圖: 給定陣

    Java常見排序演算法-插入選擇冒泡

    Java面試寶典系列之基礎排序演算法 作者:egg 郵箱:[email protected] 本文就是介紹一些常見的排序演算法。排序是一個非常常見的應用場景,很多時候,我們需要根據自己需要排序的資料型別,來自

    Java常見排序演算法-插入選擇冒泡

    本文就是介紹一些常見的排序演算法。排序是一個非常常見的應用場景,很多時候,我們需要根據自己需要排序的資料型別,來自定義排序演算法,但是,在這裡,我們只介紹這些基礎排序演算法,包括:插入排序、選擇排序、氣泡排序、快速排序(重點)、堆排序、歸併排序等等。看下圖: 給定陣

    Java 常見排序演算法-插入選擇冒泡

    本文就是介紹一些常見的排序演算法。排序是一個非常常見的應用場景,很多時候,我們需要根據自己需要排序的資料型別,來自定義排序演算法,但是,在這裡,我們只介紹這些基礎排序演算法,包括:插入排序、選擇排序、氣泡排序、快速排序(重點)、堆排序、歸併排序等等。看下圖:

    常見排序演算法-插入選擇冒泡

    作者:egg 郵箱:[email protected] 本文就是介紹一些常見的排序演算法。排序是一個非常常見的應用場景,很多時候,我們需要根據自己需要排序的資料型別,來自定義排序演算法,但是,在這裡,我們只介紹這些基礎排序演算法,包括

    常見排序演算法的C++描述

    首先看一下幾種常見排序的特性 插入排序 void insertSort(vector<int> & arr) { int sz = arr.size();

    常見排序演算法java和C++版)(參考《演算法》)

    博主這裡要講的幾種排序演算法包括(從難到易):1.氣泡排序(最low的演算法) 2.插入排序 3.希爾排序 4.歸併排序 5.快速排序 6.快速排序的三項切分 氣泡排序: (1)簡介:這是最原始,最簡單的排序,幾乎不需要額外的空間 (2)基本原理:通過迴圈將最大的元素移到

    總結排序演算法Java實現

    1、氣泡排序 氣泡排序是一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。 Java程式碼: import java.util.Random; public class BubbleSort { /** * 改進的氣

    Java學習排序演算法練習

    幾大排序演算法練習 1、各種排序演算法** 氣泡排序 (Bubble Sort) 選擇排序 (Selection Sort) 插入排序 (Insertion Sort) 氣泡排序(Bubble Sort) 基本思想是對比相鄰的元素值,如果滿足條件就交換元

    Java常用的八排序演算法與程式碼實現(一):氣泡排序插入排序選擇排序

    這三種排序演算法適合小規模資料排序 ---   共同點:基於比較,時間複雜度均為O(n2),空間複雜度均為O(1)(原地排序演算法)   不同點:插入排序和氣泡排序是穩定的排序演算法,選擇排序不是 ---   穩定排序演算法:可以保持數值相等的兩個物件,在排序之

    11. 常見的有哪排序演算法,試比較其時間複雜度,以及是否穩定,及各自使用的情形

    1、幾種常見排序演算法的時間複雜度 排序方法 平均情況 最好情況 最壞情況 直接插入排序 O(n2) O(n) O(n2) 起泡排序 O(n2) O(n) O(n2) 快速排序 O(nlog2n) O(nlog2n)

    排序演算法java實現

    沒有配圖,過幾天補上 package com.sort; public class Sort { /** * 插入排序 * 原理:往有序的子陣列選擇一個合適的位置插進去 * */ public void insertSort(int sort[

    Java常見的陣列排序演算法(包括冒泡選擇插入,快速排序)

    1 public static void bubbleSort(int[] arr) { 2 3    for(int x=0; x<arr.length-1; x++) { 4 5    for(int y=0; y<arr.length-x-

    排序演算法java版本

    很早以前的程式碼了,今天發在這裡備份一下,也供有需要的朋友參考。1. 排序中的數值交換/** * 交換陣列中的兩個值的位置 * @param datas * @param ind1 * @param ind2 */ privat

    Java常用的八排序演算法與程式碼實現(三):桶排序計數排序基數排序

    三種線性排序演算法:桶排序、計數排序、基數排序 線性排序演算法(Linear Sort):這些排序演算法的時間複雜度是線性的O(n),是非比較的排序演算法 桶排序(Bucket Sort)   將要排序的資料分到幾個有序的桶裡,每個桶裡的資料再單獨進行排序,桶內排完序之後,再把桶裡的

    Java常用的八排序演算法與程式碼實現(二):歸併排序快速排序

    注:這裡給出的程式碼方案都是通過遞迴完成的 --- 歸併排序(Merge Sort):   分而治之,遞迴實現   如果需要排序一個數組,我們先把陣列從中間分成前後兩部分,然後對前後兩部分進行分別排序,再將排好序的數組合並在一起,這樣整個陣列就有序了   歸併排序是穩定的排序演算法,時間

    排序演算法,記錄一下

    個人也就會四種排序(bubble,select,insert,quick),哈哈,看官大人可能有點失望。自己也看過幾種,不過一直沒寫過其他的,就記錄下這四種吧。 程式碼均可直接通過編譯。各種版本實現都有出入,不過思想都是一樣。工作這麼久還沒有一次性完全寫正確過,功力還是差點。 #includ

    【python資料結構與演算法排序演算法:氣泡排序快速排序

    以下排序演算法,預設的排序結果是從小到大。 一.氣泡排序: 1.氣泡排序思想:越大的元素,就像越大的氣泡。最大的氣泡才能夠浮到最高的位置。 具體來說,即,氣泡排序有兩層迴圈,外層迴圈控制每一輪排序中操作元素的個數——氣泡排序每一輪都會找到遍歷到的元素的最大值,並把它放在最後,下一輪排序時

    Java語言實現六排序演算法

    Java語言實現六種排序演算法 Java語言實現六種排序演算法 氣泡排序 插入排序 歸併排序 快速排序 希爾排序 選擇排序

    排序演算法

    本文轉載自碼農網:http://www.codeceo.com/article/10-sort-algorithm-interview.html#0-tsina-1-10490-397232819ff9a47a7b7e80a40613cfe1 查詢和排