xjb整理了一下,你们xjb凑合这看看吧。
有错误请联系我 = =。
堆排序和基数排序以后补一下。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
#include <cctype>
using namespace std;
const int maxn = 1000;
int aa[maxn];
int a[maxn];
int n;
struct Node{
void Input(){
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d",&aa[i]);
}
void Copy(){
for(int i=0; i<n; i++)
a[i] = aa[i];
}
void Print(){
for(int i=0; i<n; i++)
printf("%d%c",a[i], i == (n-1) ? '\n' : ' ');
}
}op;
///////////////////////////////////////////////////////////////////
void Insertsort(){
for(int i=1; i<n; i++){
if(a[i] < a[i-1]){
int temp = a[i];
int j;
for(j=i-1; j>=0; j--){//从前i-1中选择一个位置放进去
if(a[j] > temp) a[j+1] = a[j];
else break;
}
a[j+1] = temp;
}
}
}
///////////////////////////////////////////////////////////////////
void Xiersort(){
for(int gap=n/2; gap>0; gap/=2){//希尔增量
for(int i=0; i<gap; i++){//枚举0-gap
for(int j=gap+i; j<n; j+=gap){//间隔为gap
if(a[j] < a[j-gap]){//直接插入排序
int temp = a[j];
int k;
for(k=j-gap; k>=0; k-=gap){
if(a[k] > temp) a[k+gap] = a[k];
else break;
}
a[k+gap] = temp;
}
}
}
}
}
///////////////////////////////////////////////////////////////////
void Selectsort(){
for(int i=0; i<n-1; i++){//进行n-1躺选择
int id = i;
int min_ = a[i];
for(int j=i+1; j<n; j++){//从后面的数中挑出一个最小的
if(a[j] < min_){
id = j;
min_ = a[j];
}
}
swap(a[i],a[id]);
}
}
///////////////////////////////////////////////////////////////////
void mergearray(int l, int mid, int r){
int temp[maxn];//辅助数组
int i = l;
int j = mid+1;
int m = mid;
int n = r;
int cnt = 0;
while(i <= m && j <= n){
if(a[i] <= a[j])
temp[cnt++] = a[i++];
else
temp[cnt++] = a[j++];
}
while(i <= m)//两个数组比完多出来的部分
temp[cnt++] = a[i++];
while(j <= n)
temp[cnt++] = a[j++];
for(int i=0; i<cnt; i++)
a[l + i] = temp[i];
}
void Unitesort(int l, int r){
if(l < r){
int m = (l + r) / 2;
Unitesort(l,m);//递归合并
Unitesort(m+1,r);
mergearray(l, m, r);
}
}
///////////////////////////////////////////////////////////////////
void Quicksort(int l, int r){
if(l > r) return;
int temp = a[l];//基数为左边,所以从右边开始找
int i = l;
int j = r;
while(i != j){
while(a[j] >= temp && i < j)//从右边开始
j--;
while(a[i] <= temp && i < j)
i++;
if(i < j) swap(a[i],a[j]);
}
a[l] = a[i];//交换基数位置
a[i] = temp;
Quicksort(l, i-1);
Quicksort(i+1, r);
}
///////////////////////////////////////////////////////////////////
int main(){
op.Input();
/*
10
49 38 65 97 26 13 27 49 55 4
*/
///////////////////
//冒泡排序 最差n2, 平均n2 最好n 空间复杂度1
///////////////////
///////////////////
op.Copy();
Insertsort();//直接插入排序 最差n2, 平均n2, 最快n,空间复杂度 1
op.Print();
///////////////////
op.Copy();
Xiersort();//希尔排序 最差n2(内部为一个直接插入), 平均nlogn, 最优n*sqrt(n), (一般只看最优) 空间复杂度 1
op.Print();
///////////////////
op.Copy();
Selectsort();//直接选择排序 最差n2, 平均n2, 最快n2, 空间复杂度 1
op.Print();
///////////////////
op.Copy();
Unitesort(0,n-1);//归并排序 最差 nlogn, 平均 nlogn, 最快 nlogn, 空间复杂度 n ,***最稳定的排序***
op.Print();
///////////////////
op.Copy();
Quicksort(0,n-1);//快速排序, 最差n2, 平均nlogn, 最快nlogn 空间复杂度 logn - n (因为递归需要栈的空间)
op.Print();
///////////////////
//堆排序 最差 nlogn, 平均 nlogn, 最快 nlogn, 空间复杂度 1
//基数排序 最好=最差=平均 = d(n+rd) , 空间复杂度 n+rd rd为选择桶的个数 d为数字的位数
//代码我都不会..
///////////////////
}