排序算法,你会几个???

  做 |  三玖天下第一   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发明,第一个突破