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

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

作者: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常見排序演算法-插入選擇冒泡

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    排序演算法,記錄一下

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

    總結排序演算法的Java實現

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

    排序演算法

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

    排序演算法的Python形式

    直接見程式碼吧,因為比較簡單 依次為 冒泡 選擇 快排 插入 歸併 堆排 桶排  class Sort: def bubble(self, nums): for i

    自我整理:排序演算法的理解

    簡單來自己做個筆記,溫故一下排序方法。 1.直接排序 顧名思義,直接排,怎麼直接排,每次迴圈找出最下的扔到第一個,或者找到最大的扔到最後一個,剩下的數字,繼續迴圈找最小的往前扔,暴力排完。簡單粗暴,居家

    排序演算法java實現

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

    用C++實現七排序演算法,可選擇排序方法,簡單易懂。

           最近學習演算法,先從簡答的開始學起,用C++做了一個實現七種排序演算法的介面,可選擇想要用的選擇演算法,不過,由於時間倉促,沒有來得及優化和程式碼註釋,後期還會加上程式碼註釋,隨便優化一下程式碼,提高執行效率; /***********************

    排序演算法實現以及穩定性

    穩定性演算法:氣泡排序、插入排序、歸併排序、基數排序 不穩定性演算法:選擇排序、快速排序、堆排序、希爾排序、桶排序 /**  *   * @author huangsen  * 插入排序:一個有序陣列,一個無序陣列,將無序陣列插入到有序陣列中  *  */ public

    常用排序演算法的時間複雜度和空間複雜度

     常用的排序演算法的時間複雜度和空間複雜度 排序法  最差時間分析 平均時間複雜度  穩定度  空間複雜度  氣泡排序 O(n2) O(n2)  穩定  O(

    排序演算法介紹與效能分析

    本文以對整形陣列升序排序為例,列舉了排序的幾種演算法及相應的Java實現,並在本文最後給出這幾種演算法的效能分析圖表。 1、插入排序  基本思路:在每次迴圈中把一個元素插入到已經排序的部分序列裡的合適位置,使得到的序列仍然是有序的。 實現: void sort(int a

    排序演算法java版本

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