這裏介紹七個排序算法
選擇排序應該是最簡單的排序之一
簡單來講,找到剩餘區間內的最小值而後放在一個有序區間的末尾
(不用糾結剩餘區間什麼意思,模擬一遍後你就會知道數組
for(int i=1;i<len;++i){ int maxi=i; for(int j=i+1;j<=len;++j)//剩餘區間 if(s[j]<s[maxi]) maxi=j;//記錄區間中最小值下標 swap(s[maxi],s[i]); }
插入排序是經過「插入」來排序函數
經過將一個數插入到一個有序區間的某個位置,從而保證插入後區間有序
設爲插入的數爲b(插入後區間長度+1
則b在區間知足的條件爲 \(a[i]<b<a[i+1]\)spa
舉個簡單例子指針
其實模擬一遍就很容易懂code
for(int i=1;i<len;++i){ cin>>s; for(int j=i-1;j>=1 && a[j]>s;--j) a[j+1]=a[j];//從後往前找 a[j+1]=s;//此時j爲第一個小於s的數的下標 }
選擇排序應該是最簡單的排序之一
簡單來講,找到剩餘區間內的最小值而後放在一個有序區間的末尾
(不用糾結剩餘區間什麼意思,模擬一遍後你就會知道blog
for(int i=1;i<len;++i){ int maxi=i; for(int j=i+1;j<=len;++j)//剩餘區間 if(s[j]<s[maxi]) maxi=j;//記錄區間中最小值下標 swap(s[maxi],s[i]); }
冒泡排序思想很簡單,實現也很簡單排序
咱們知道數組下標是有序的,只要咱們在數組中,以這個數的爲下標的位置的數標記一下就能夠,從1開始找,找到有標記位置就將輸出遞歸
bool t[maxn]; for(int i=1;i<=len;++i){ int num;cin>>num; t[num]=1; }
堆排序通常能夠直接用優先隊列實現(這裏不展開講,有興趣同窗能夠到去看其餘blog隊列
#include<queue>//須要用到這個頭文件 priority_queue<>
快速排序實際上是用到了分治的思想
將一個區間分爲兩個區間,左區間小中間這個數,右區間大於中間這個數
逐次遞歸分解愈來愈小的區間,最後使整個區間有序
void sort(int l,int r){ int mid=s[(l+r)>>1];//位運算等價於(l+r)/2; int i=l,j=r; while(i<=j){//這幾步就是使左右區間的數分別知足小於和大於mid while(s[i]<mid) ++i;//i必定不大於 (l+r)/2 while(s[j]>mid) --j;//j必定不小於 (l+r)/2 //思考下爲何不大於等於 if(i<=j){ swap(s[i],s[j]); i++;j--; } } //此時區間劃分爲[l,j] 和[i,r] if(l<j) sort(l,j); if(i<r) sort(i,r); }
通常不手寫由於stl有
#include<algorithm> bool cmp(int a,int b){//int 可根據數組類型改成double或其餘(甚至能夠是結構體 return a<b;//數組按從小到大排序 return a>b;//數組按從大到小排序 } sort(a+1,a+1+n,cmp)//a爲數組,a+1爲須要排序的數組的起始位置,a+1+n爲末位置,cmp爲自定義函數
這裏主要講二路歸併(還有多路歸併
二路歸併一樣也有分治的思想
將兩個有序的區間,合爲一個有序的區間,和前面講過的同樣,一個數即爲一個有序區間,
int m[maxn];//原序列 int temp[maxn];//存有序區間 void marge_sort(int l,int r){ if(l==r) return ; int mid=(l+r)>>1; marge_sort(l,mid);//左區間 marge_sort(mid+1,r);//右區間 int i=l,j=mid+1,p=l;//i爲左區間左端點,j爲右區間左端點 p爲合成區間的末端指針 while(i<=mid && j<=r){ if(m[i]<m[j]) temp[p++]=m[i++];//兩個序列相比較,小的放 else temp[p++]=m[j++]; } while(i<=mid) temp[p++]=m[i++];//右區間已經放完,而左區間也是有序的則,直接放入有區間後 while(j<=r) temp[p++]=m[j++];//同理,直接放入 for(i=l;i<=r;++i) m[i]=temp[i];//把有序序列放置給m }
還有不少排序算法沒有講到 若是有不清楚的地方能夠發評論私信提問 講的不行還望海涵