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