zoukankan      html  css  js  c++  java
  • 各种排序

    #include <stdio.h>
    #include <iostream>
    #include<algorithm>
    #include<windows.h>
    #include<math.h>
    using namespace std;
    #define Max 20
    #define LT(a,b) ((a)<(b))
    void setcolor(int color)
    {
        HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hout,color);
    }
    typedef struct
    {
        int key;
    }Red;
    typedef struct
    {
        Red r[Max+1];
        int length;
    }SqList;
    //起泡排序
    void BubbleSort(SqList &L)
    {
        for(int i=1;i<=L.length;i++)
            for(int j=i;j<=L.length;j++)
                if(L.r[j].key<L.r[i].key)
                    swap(L.r[i],L.r[j]);
    }
    //简单选择排序
    int SelectMinKey(SqList &L,int i)
    {
        int k=i;
        for(int j=k;j<=L.length;j++)
            if(L.r[j].key<L.r[i].key)
                k=j;
        return k;
    }
    void SelectSort(SqList &L)
    {
        for(int i=1;i<=L.length;i++)
        {
            int j = SelectMinKey(L,i);
            if(i!=j)
                swap(L.r[i],L.r[j]);
        }
    }
    //直接插入排序
    void InsertSort(SqList &L)
    {
        for(int i=2;i<=L.length;i++)
            if(LT(L.r[i].key,L.r[i-1].key))
            {
                L.r[0]=L.r[i];
                L.r[i]=L.r[i-1];
                for(int j=i-2;LT(L.r[0].key,L.r[j].key);j--)
                    L.r[j+1]=L.r[j];
                L.r[j+1]=L.r[0];
            }
    }
    //希尔排序(缩小增量排序)
    void ShellInsert(SqList &L,int dk)
    {
        for(int i=dk+1;i<=L.length;i++)
            if(LT(L.r[i].key,L.r[i-dk].key))
            {
                L.r[0]=L.r[i];
                for(int j=i-dk;j>0&&LT(L.r[0].key,L.r[j].key);j-=dk)
                    L.r[j+dk]=L.r[j];
                L.r[j+dk]=L.r[0];
            }
    }
    void ShellSort(SqList &L)
    {
        int temp;
        if(int(log(L.length+1)/log(2))%2==0)
            temp = int(log(L.length+1)/log(2))+1;
        else
            temp = int(log(L.length+1)/log(2));
        for(int k=temp;k>=1;k-=2)
            ShellInsert(L,k);
    }
    //快速排序
    int Partition(SqList &L,int low,int high)
    {
        L.r[0]=L.r[low];
        int pivotkey = L.r[low].key;
        while(low<high)
        {
            while(low<high&&L.r[high].key>=pivotkey)
                high--;
            L.r[low]=L.r[high];
            while(low<high&&L.r[low].key<=pivotkey)
                low++;
            L.r[high]=L.r[low];
        }
        L.r[low]=L.r[0];
        return  low;
    }
    void QSort(SqList &L,int low,int high)
    {
        if(low<high)
        {
            int pivotloc = Partition(L,low,high);
            QSort(L,low,pivotloc-1);
            QSort(L,pivotloc+1,high);
        }
    }
    void QuickSort(SqList &L)
    {
        QSort(L,1,L.length);
    }
    //堆排序
    void HeapAdjust(SqList &H,int s,int m)
    {
        Red rc = H.r[s];
        for(int j =2*s;j<=m;j*=2)
        {
            if(j<m&&LT(H.r[j].key,H.r[j+1].key))
                j++;
            if(!LT(rc.key,H.r[j].key))
                break;
            H.r[s]= H.r[j];
            s=j;
        }
        H.r[s]=rc;
    }
    void HeapSort(SqList &L)
    {
        for(int i=L.length/2;i>0;--i)
            HeapAdjust(L,i,L.length);
        for(i=L.length;i>1;--i)
        {
            swap(L.r[1],L.r[i]);
            HeapAdjust(L,1,i-1);
        }
    }
    void insert(SqList &L)
    {
        int i=1;
        setcolor(5);
        printf("请输入要排序的数,按 Ctr+Z 结束\n");
        while(scanf("%d",&L.r[i++].key)!=-1);
        L.length=i-2;
    }
    void Sort_Print(SqList L)
    {
        printf("排序后的数\n");
        for(int i=1;i<=L.length;i++)
            printf("%d   ",L.r[i].key);
        printf("\n");
    }
    int main()
    {
        SqList L;
        int slect;
        while(1)
        {
            setcolor(11);
            printf("    *******以下程序来自myth编写版权所有,翻录必究.*******\n");
            setcolor(6);
            printf("请选择编号:\n");
            setcolor(4);
            printf("        1.起泡排序        2.简单选择排序\n");
            printf("        3.直接插入排序        4.希尔排序(缩小增量排序)\n");
            printf("            5.快速排序        6.堆排序\n");
            printf("        7.退出程序\n");
            setcolor(10);
            cin>>slect;
            setcolor(5);
            switch(slect)
            {
            case 1:
                insert(L);
                setcolor(7);
                BubbleSort(L);
                Sort_Print(L);
                break;
            case 2:
                insert(L);
                setcolor(7);
                SelectSort(L);
                Sort_Print(L);
                break;
            case 3:
                insert(L);
                setcolor(7);
                InsertSort(L);
                Sort_Print(L);
                break;
            case 4:
                insert(L);
                setcolor(7);
                ShellSort(L);
                Sort_Print(L);
                break;
            case 5:
                insert(L);
                setcolor(7);
                QuickSort(L);
                Sort_Print(L);
                break;
            case 6:
                insert(L);
                setcolor(7);
                HeapSort(L);
                Sort_Print(L);
                break;
            case 7:
                printf("谢谢使用----神话\n");
                exit(0);
            default:
                printf("\"So bad!\"输入错误.\n");
                getchar();
            }
            printf("请按任意键继续.....\n");
            getchar();
            system("cls");
        }
        return 0;
    }
    /*
    3 2 1 -1 6 5 7 9 10 8
    */
  • 相关阅读:
    Java类型转换
    Java数据类型
    Java运行机制-简单理解
    Dos基础命令
    MarkDown
    MSP430 ADC12模块(转)
    解决拷贝中文注释到KEIL4.6中呈现乱码的问题
    ADS1.2 DEBUG调试时提示:erro starting external process,Process error code 87(0x57)
    MDK4.6提示不能找到库
    在JLINK4.12的安装目录下没有LPC2214.jflash文件的解决办法
  • 原文地址:https://www.cnblogs.com/heqinghui/p/2864814.html
Copyright © 2011-2022 走看看