实验六:排序

1.简单选择排序 2.直接插入排序
3.冒泡排序 4.希尔排序
5.快速排序 6.堆排序
7.折半插入排序

#include<bits/stdc++.h>
#define MAXSIZE 100
using namespace std;
typedef struct{
    int *elem;
    int len;
}SqList;
void menu()///菜单
{
    cout<<"实验6:排序\n\n";
    cout<<"菜单:";
    cout<<"\t1.简单选择排序\t\t 2.直接插入排序\n";
    cout<<"\t3.冒泡排序\t\t 4.希尔排序\n";
    cout<<"\t5.快速排序\t\t 6.堆排序\n";
    cout<<"\t7.折半插入排序\t\t 0.退出\n";
}
void Swap(int &a,int &b){int t;t=a;a=b;b=t;}
void Input(SqList &L)///输入
{
    char ch;L.len=0;
    L.elem=new int[MAXSIZE];
    cout<<"请输入一组数据:";
    cin>>L.elem[++L.len];
    while((ch=getchar())!='\n')
        cin>>L.elem[++L.len];
}
void Output(SqList L)///输出
{
    for(int i=1;i<=L.len;i++)
        cout<<L.elem[i]<<' ';
    cout<<endl;
}
void SelectSort(SqList &L)///简单选择排序
{
    Input(L);
    for(int i=1;i<L.len;i++){
        int k=i;
        for(int j=i+1;j<=L.len;j++)
            if(L.elem[j]<L.elem[k])
                k=j;
        if(k!=i)
            Swap(L.elem[i],L.elem[k]);
    }
    Output(L);
}
void BubbleSort(SqList &L)///冒泡排序
{
    Input(L);
    for(int i=1;i<L.len;i++){
        int flag=0;
        for(int j=1;j<L.len;j++){
            if(L.elem[j]>L.elem[j+1]){
                Swap(L.elem[j],L.elem[j+1]);
                flag=1;
            }
        }
        if(!flag)break;
    }
    Output(L);
}
void InsertSort(SqList &L)///直接插入排序
{
    Input(L);int i,j;
    for(i=2;i<=L.len;i++){
        if(L.elem[i]<L.elem[i-1]){
            L.elem[0]=L.elem[i];
            for(j=i-1;L.elem[0]<L.elem[j];j--)
                L.elem[j+1]=L.elem[j];
            L.elem[j+1]=L.elem[0];
        }
    }
    Output(L);
}
void BinInsertSort(SqList &L)///折半插入排序
{
    Input(L);int i,j;
    for(i=2;i<=L.len;i++){
        if(L.elem[i]<L.elem[i-1]){
            L.elem[0]=L.elem[i];
            int low=1,high=i-1,mid;
            while(low<=high){
                mid=(low+high)>>1;
                if(L.elem[0]<L.elem[mid])high=mid-1;
                else low=mid+1;
            }
            for(int j=i-1;j>=high+1;j--)
                L.elem[j+1]=L.elem[j];
            L.elem[high+1]=L.elem[0];
        }
    }
    Output(L);
}
void ShlleSort(SqList &L)///希尔排序
{
    Input(L);
    int dk=sqrt(L.len),i,j;
    for(int k=0;k<log(L.len+1);k++){
        dk=sqrt(dk);
        for(i=dk+1;i<=L.len;i++){
            if(L.elem[i]<L.elem[i-dk]){
                L.elem[0]=L.elem[i];
                for(j=i-dk;j>0&&L.elem[0]<L.elem[j];j-=dk)
                    L.elem[j+dk]=L.elem[j];
                L.elem[j+dk]=L.elem[0];
            }
        }
    }
    Output(L);
}
void QuickSort(SqList &L,int low,int high)///快速排序
{
    if(low>high)return;
    L.elem[0]=L.elem[low];
    int pivotkey=L.elem[low];
    int i=low,j=high;
    while(i<j){
        while(i<j&&L.elem[j]>=pivotkey)j--;
        L.elem[i]=L.elem[j];
        while(i<j&&L.elem[i]<=pivotkey)i++;
        L.elem[j]=L.elem[i];
    }
    L.elem[i]=L.elem[0];
    QuickSort(L,low,i-1);
    QuickSort(L,i+1,high);
    return;
}
struct{ ///堆排序
    void HeadAdjust(SqList &L,int s,int m){
        int rc=L.elem[s];
        for(int j=2*s;j<=m;j*=2){
            if(j<m&&L.elem[j]<L.elem[j+1])++j;
            if(rc>=L.elem[j])break;
            L.elem[s]=L.elem[j];s=j;
        }
        L.elem[s]=rc;
    }
    void CreatHeap(SqList &L){
        int n=L.len;
        for(int i=n/2;i>0;--i)
            HeadAdjust(L,i,n);
    }
    void HeapSort(SqList &L){
        Input(L);
        CreatHeap(L);
        for(int i=L.len;i>1;--i){
            Swap(L.elem[1],L.elem[i]);
            HeadAdjust(L,1,i-1);
        }
        Output(L);
    }
}HS;
int main()
{
    SqList List;
    menu();
    int choose=-1;
    while(choose){
        cout<<"\n请输入指令:";
        cin>>choose;
        switch(choose){
            case 1: SelectSort(List);break;
            case 2: InsertSort(List);break;
            case 3: BubbleSort(List);break;
            case 4: ShlleSort(List);break;
            case 5: Input(List);QuickSort(List,1,List.len);Output(List);break;
            case 6: HS.HeapSort(List);break;
            case 7: BinInsertSort(List);break;
        }
    }
    cout<<"退出成功!\n";
    return 0;
}
/*
2 6 5 3 0 1 4
-4 -2 0 -9 -7 -3
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值