各种排序

#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
*/
原文地址:https://www.cnblogs.com/heqinghui/p/2864814.html