基于比较的排序
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("
");
}
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("
");
}
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;
}