排序

生成测试数组

#include <iostream>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <cstring>
using namespace std;
const int maxn = 1e5+5;
int a[maxn];
int n;
int rand(int n){
	return random()%n+1;//[1,n]
}
void getdata(){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		a[i] = rand(n);
	}
}
void print(){
	for(int i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	putchar('
');
}
int main(){
	srand(time(0));
	getdata();
	print();
	//sort;
	print();
	return 0;
}

插入排序

(O(nlogn))

void insertsort(int l,int r){
	int i = l, j;
	while(i <= r){
		if(a[i] < a[i - 1]){
			int temp = a[i];
			j = i;
			while(j >= 0 && a[j - 1] > temp)a[j] = a[j - 1],j--;
			a[j] = temp;
		}
		i++;
	}
}

冒泡排序

(O(n^{2}))

void bubble_sort(int *a){
	for(int i=0;i<n-1;i++){
		for(int j=0;j<n-i-1;j++){
			if(a[j]>a[j+1])swap(a[j],a[j+1]);
		}
	}
}

选择排序

(O(n^{2}))

void bubble_sort(int *a){
	int k;
	for(int i=0;i<n-1;i++){
		k = i;
		for(int j=i+1;j<n;j++){
			if(a[k]>a[j])k = j;
		}
		if(k!=i)swap(a[i],a[k]);
	}
}

归并排序

(O(nlogn))

void merge_sort(int l,int r){
	if(l == r)return;
	int mid = (l+r) >> 1;
	merge_sort(l, mid);
	merge_sort(mid+1, r);
	int i = l,j = mid + 1,t = l;
	while(i <= mid && j <=r){
		if(a[i] <= a[j])b[t++] = a[i++];
		else b[t++] = a[j++];
	}
	while(i <= mid)b[t++] = a[i++];
	while(j <= r)b[t++] = a[j++];
	for(int k = l;k <= r; k++)a[k] = b[k];
}

快速排序

堆排序

(O(nlogn))

void Heapadjust(int p,int n){//调整该点和该点的所有孩子
	int temp;
	temp = a[p];
	for(int i = 2 * p;i <= n;i *= 2){
		if(i < n && a[i] < a[i + 1])i++;//找到孩子中较大的
		if(temp >= a[i])break;
		a[p] = a[i];
		p = i;
	}
	a[p] = temp;
}
void Heapsort(int l,int r){
	for(int i=n/2;i>0;i--){//构造初始堆
		Heapadjust(i,n);
	}
	for(int i=n;i>1;i--){
		swap(a[1],a[i]);
		Heapadjust(1,i - 1);
	}
}

希尔排序

排序的一些概念

  • 稳定排序
  • 不稳定排序
原文地址:https://www.cnblogs.com/Emcikem/p/12006643.html