排序算法,你會幾個???

  做 |  三玖天下第一   html

來源 | cnblogs.com/hzoi-liujiahui/p/13256439.htmljava


一、冒泡排序c++

  • 冒泡排序是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,若是它們的順序錯誤就把它們交換過來。走訪數列的工做是重複地進行直到沒有再須要交換,也就是說該數列已經排序完成。這個算法的名字由來是由於越小的元素會經由交換慢慢「浮」到數列的頂端。程序員


1.1 算法描述


  • n個元素的序列,通過n-1趟選擇排序獲得有序結果。具體算法描述以下:web

  1. 初始狀態:無序區爲R[1..n],有序區爲空;面試

  2. 每一輪從無序區起點開始,相鄰元素兩兩比較,若是前面的比後面的元素大就交換,直到無序區最後。算法

  3. 針對全部的元素重複以上的步驟,每一輪冒泡操做無序區域元素減一,有序區元素減一;後端

  4. 重複執行n-1輪,序列變爲有序。數組


1.2 動圖演示


1.3 代碼實現微信

#include <bits/stdc++.h>
const int maxn=1e4+5,Inf=2147483647;
int a[maxn];
int n;
void Read(){
  scanf("%d",&n);
  srand(time(0));
  for(int i=1;i<=n;++i)
    a[i]=rand()%10000;
}
void Print(){
  for(int i=1;i<=n;++i)
    printf("%d ",a[i]);
}
void Bubble_sort(int a[]){
  for(int i=1;i<n;++i){//通過n-1輪的冒泡操做
    for(int j=1;j<=n-i;++j)//沒操做一輪,待排序的少一個
      if(a[j]>a[j+1])
        std::swap(a[j],a[j+1]);
  }
}
void Solve(){
  Read();
  Bubble_sort(a);
  Print();
}
int main(){
  Solve();
  return 0;
}


2.選擇排序


  • 選擇排序(Selection-sort)是一種簡單直觀的排序算法。它的工做原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,而後,再從剩餘未排序元素中繼續尋找最小(大)元素,而後放到已排序序列的末尾。以此類推,直到全部元素均排序完畢。


2.1 算法描述


  • n個記錄的直接選擇排序可通過n-1趟直接選擇排序獲得有序結果。具體算法描述以下:

    1. 初始狀態:無序區爲R[1..n],有序區爲空;

    2. 第i趟排序(i=1,2,3…n-1)開始時,當前有序區和無序區分別爲R[1..i-1]和R(i..n)。該趟排序從當前無序區中-選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R[i+1..n)分別變爲記錄個數增長1個的新有序區和記錄個數減小1個的新無序區;

    3. n-1趟結束,數組有序化了。


2.2 動圖演示


2.3 代碼實現

   
     
   
   
   
    
    
             
    
    
 
     


#include <bits/stdc++.h>
const int maxn=1e4+5,Inf=2147483647;
int a[maxn];
int n;
void Read(){
  scanf("%d",&n);
  srand(time(0));
  for(int i=1;i<=n;++i)
    a[i]=rand()%10000;
}
void Print(){
  for(int i=1;i<=n;++i)
    printf("%d ",a[i]);
}
void Select_sort(int a[]){
  int k=0;
  for(int i=1;i<n;++i){//n-1輪,每一輪找到一個最小的
    k=i;//k指向未排序的最小
    for(int j=i+1;j<=n;++j)
      if(a[k]>a[j])
        k=j;
    std::swap(a[i],a[k]);
  }
}
void Solve(){
  Read();
  Select_sort(a);
  Print();
}
int main(){
  Solve();
  return 0;
}

3. 插入排序



  • 插入排序(Insertion-Sort)的算法描述是一種簡單直觀的排序算法。它的工做原理是經過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。


3.1 算法描述


  1. 從第一個元素開始,該元素能夠認爲已經被排序;

  2. 取出下一個元素,在已經排序的元素序列中從後向前掃描;

  3. 若是該元素(已排序)大於新元素,將該元素移到下一位置;

  4. 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置;

  5. 將新元素插入到該位置後;

  6. 重複步驟2~5。


3.2 動圖演示


3.3 代碼實現

   
     
   
   
   
    
    
             
    
    
 
     
#include <bits/stdc++.h>
const int maxn=1e4+5,Inf=2147483647;
int a[maxn];
int n;
void Read(){
  scanf("%d",&n);
  srand(time(0));
  for(int i=1;i<=n;++i)
    a[i]=rand()%10000;
}
void Print(){
  for(int i=1;i<=n;++i)
    printf("%d ",a[i]);
}
void Insert_sort(int a[]){
  for(int i=2;i<=n;++i){
    for(int j=i;j>1 && a[j-1]>a[j];--j)
      std::swap(a[j],a[j-1]);
  }
}
void Solve(){
  Read();
  Insert_sort(a);
  Print();
}
int main(){
  Solve();
  return 0;
}



4. Shell排序


  • 1959年Shell發明,第一個突破