算法笔记-排序算法

基于比较的排序

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;
}
原文地址:https://www.cnblogs.com/houzm/p/13357700.html