#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&<(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&<(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
*/