排序小汇总

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为数字的位数
    //代码我都不会..
///////////////////
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值