各種排序的原理
氣泡排序(bubble_sort):
1.每次只比較相鄰的元素,每一趟比較下來後可以確定一個元素的最終位置
2.重複以上的操作
最好的時間複雜度為O(n),最壞的為O(n^2);
void bubble_sort(int Array[],int n){
for(int i=0;i<n;i++){
for(int j=0;j<n-i-1;j++){
if(Array[j]>Array[j+1]){
int tmp=Array[j];
Array[j]=Array[j+1];
Array[j+1]=tmp;
}
}
}
}
選擇排序(selection_sort)
每次選擇待排序的數列中的最大(小)值放在已經排好的序列的最後
時間複雜度為O(n^2)
void selection_sort(int Array[],int n){
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(Array[j]>Array[i]){
int tmp=Array[j];
Array[j]=Array[i];
Array[i]=tmp;
}
}
}
}
計數排序(counting_sort)
計數排序的思想就是對於每個輸入x,確定小於x的元素的個數,有了這一資訊就可以把x直接放到它在最終輸出陣列中的位置;
時間複雜度為O(N+K) n為資料的個數k為資料的範圍
void counting_sort(int a[],int b[],int n,int k){
for(int i=0;i<=k;i++)
c[i]=0;
for(int i=0;i<n;i++)
c[a[i]]++;
for(int i=1;i<=k;i++)
c[i]+=c[i-1];
for(int i=n-1;i>=0;i--){
c[a[i]]--;
b[c[a[i]]]=a[i];
}
}
<strong><span style="font-size:18px;">快速排序(quick_sort)</span></strong>
類似於氣泡排序,每次選定一個key值(通常選第一個),然後將比它小的都放在它的前面 ,比它小的都放在它的後面,比它大的都放在它的後面;
時間複雜度為O(n*logn)
(1)設定兩個變數i,j,排序開始的時候:i=0,j=n-1
(2)以第一個資料作為關鍵資料賦值給key,即key=a[0]
(3)從j開始向前搜尋,即由後開始向前搜尋(j=j-1),找到第一個小於key的值a[j],並與a[i]交換
(4)從i開始向後搜尋,即由前向後搜尋(i=i+1),找到第一個大於key的值a[i],與a[j]交換
(5)重複(3)(4)(5)步,直到i=j;
void quick_sort(int Array[],int s,int e){
int key=Array[s];
int i=s,j=e;
if(i>=j) return;
while(i<j){
while(i<j&&key<=Array[j])
j--;
Array[i]=Array[j];
while(i<j&&key>=Array[i])
i++;
Array[j]=Array[i];
}
Array[j]=key;
quick_sort(Array,s,j-1);
quick_sort(Array,j+1,e);
}
歸併排序(merge_sort)
歸併(Merge)排序法是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子
序列是有序的。然後再把有序子序列合併為整體有序序列。歸併操作的工作原理如下:
第一步:申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
第二步:設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
第三步:比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
重複步驟3直到某一指標達到序列尾,將另一序列剩下的所有元素直接複製到合併序列尾
時間複雜度為O(n*logn)
int Array[30],tmp[60];
void merge(int low,int mid,int high)
{
int i=low,j=mid+1,k=low;
while(i<=mid&&j<=high)
{
//此處為排序順序的關鍵,用小於表示從小到大排序
if(Array[i]<=Array[j]) tmp[k++]=Array[i++];
else tmp[k++]=Array[j++];
}
while(i<=mid) tmp[k++]=Array[i++];
while(j<=high) tmp[k++]=Array[j++];
for(i=low;i<=high;i++) //寫回原陣列
Array[i]=tmp[i];
}
/**全部排序的呼叫為mergeSort(0,n-1) */
void mergeSort(int a,int b)
{
if(a<b)
{
int mid=(a+b)/2;
mergeSort(a,mid);
mergeSort(mid+1,b);
merge(a,mid,b);
}
}
相關文章
- C#各種加密方法,字典排序C#加密排序
- 聽聽各種排序演算法的聲音排序演算法
- Python各種排序演算法整理Python排序演算法
- 各種快速排序-史詩級鉅作排序
- java中各種垃圾收集器的原理Java
- 各種前端框架中的路由原理解析前端框架路由
- 輕鬆搞定分組報表中的各種排序排序
- 複習資料結構:排序演算法(五)——快速排序的各種版本資料結構排序演算法
- 【資料結構】 各種排序演算法的實現資料結構排序演算法
- JS的各種排序演算法實現--暫時不懂JS排序演算法
- javascript排序各種演算法例項程式碼JavaScript排序演算法
- 用 python 實現各種排序演算法Python排序演算法
- Rxjs實踐-各種排序演算法排序過程的視覺化展示JS排序演算法視覺化
- <qsort實現一個通用的氣泡排序,排序各種型別的資料詳解>排序型別
- 幾種排序演算法的原理以及 Java 實現排序演算法Java
- 從rocketmq入手,解析各種零拷貝的jvm層原理MQJVM
- UIButton實現各種圖文結合的效果以及原理UI
- 程式猿的年終總結,各種版本各種殘
- 排序(3)--各類排序演算法的比較排序演算法
- Git科普文,Git基本原理&各種騷操作Git
- 資料結構-各種排序演算法效率對比圖資料結構排序演算法
- JAVA的各種OJava
- Nginx的各種配置Nginx
- MySQL的各種joinMySql
- Oracle 的各種表Oracle
- 各種排序演算法的特點,時間複雜度,穩定性等排序演算法時間複雜度
- 從排序原理到MYSQL中的排序方式排序MySql
- O(lgn)的三種排序,快速排序、歸併排序、堆排序排序
- **超詳細的**10種排序演算法原理及 JS 實現排序演算法JS
- 淺談意圖識別各種實現&數學原理
- 各種排序演算法思想複雜度及其java程式實現排序演算法複雜度Java
- 各種排序演算法總結及C#程式碼實現排序演算法C#
- 各種加速
- C#中的各種各樣的索引器C#索引
- 一文弄懂分散式場景中各種鎖的原理及使用分散式
- mysql的各種日誌MySql
- iOS 中的各種鎖iOS
- Windows 的各種聲音Windows