生成测试数组
#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);
}
}
希尔排序
排序的一些概念
- 稳定排序
- 不稳定排序