演算法筆記-排序演算法
阿新 • • 發佈:2020-07-21
目錄
基於比較的排序
O(n^2)
氣泡排序
// 氣泡排序
void bubble(int A[],int len) {
for(int i=0; i<len-1; i++) {
bool flag = false; //// 提前退出冒泡迴圈的標誌位
for(int j=0; j<len-i-1; j++) {
if(A[j]>A[j+1]) {
swap(A[j],A[j+1]);
flag = true;
}
}
if(!flag)break;
}
}
插入排序
// 插入排序
void insert(int A[],int len) {
for(int i=1; i<len; i++) {
int temp = A[i];
int j=i-1;
for(; j>=0; j--) {
if(A[j]>temp) A[j+1]=A[j];
else break;
}
A[j+1]=temp;
show(A,len);
}
}
選擇排序
// 選擇排序 void select(int A[],int len) { for(int i=0; i<len; i++) { int mini=i; for(int j=i;j<len;j++){ if(A[j]<A[mini]){ mini=j; } } swap(A[i],A[mini]); } }
O(nlogn)
歸併排序
#include <iostream> using namespace std; // 歸併函式 void merge(int A[],int p,int m,int r) { int i=p,j=m+1,k=0; int temp[r-p+1]= {0}; while(i<=m&&j<=r) { if(A[i]<=A[j])temp[k++]=A[i++]; else temp[k++]=A[j++]; } while(i<=m)temp[k++]=A[i++]; while(j<=r)temp[k++]=A[j++]; memcpy(A+p,temp,sizeof(int)*(r-p+1)); } // 歸併排序 void merge_sort_c(int A[],int p, int r) { if(p>=r)return; //中點 int q = (p+r)>>1; //分治遞迴 merge_sort_c(A,p,q); merge_sort_c(A,q+1,r); merge(A,p,q,r); } void merge_sort(int A[],int len) { merge_sort_c(A,0,len-1); } void show(int A[],int len) { for(int i=0; i<len; i++) { printf("%d ",A[i]); } printf("\n"); } int main(int argc,char * argv[]) { int A[10]= {3,4,2,2,1,9,8,7,5,6}; show(A,10); merge_sort(A,10); show(A,10); return 0; }
快速排序
#include <iostream>
using namespace std;
// 分割槽函式
int partition(int A[],int p, int q) {
int pivot = A[q]; //分割槽點
int i=p,j=p;
while(j<q) {
if(A[j]<=pivot) {
swap(A[i++],A[j]);
}
j++;
}
swap(A[i],A[j]);
return i;
}
//快排
void quick_sort_c(int A[],int p, int q) {
if(p>=q)return;
int r = partition(A,p,q);
quick_sort_c(A,p,r-1);
quick_sort_c(A,r+1,q);
}
void quick_sort(int A[],int len) {
quick_sort_c(A,0,len-1);
}
void show(int A[],int len) {
for(int i=0; i<len; i++) {
printf("%d ",A[i]);
}
printf("\n");
}
int main(int argc,char * argv[]) {
int A[10]= {3,4,2,2,1,9,8,7,5,6};
show(A,10);
quick_sort(A,10);
show(A,10);
return 0;
}