排序的四种算法

来源:互联网 发布:马刺 知乎 编辑:程序博客网 时间:2024/06/11 19:11
#include <stdio.h>#include <stdlib.h>#include <time.h>#include <Windows.h>// 生成 num 个范围在 0~max 之间的整数void CreateInt(int *p, int num, int max);// 演示排序函数int ShowSort(int *p, int num, HANDLE hOut, WORD corBase);void CompareSort(int *p, int num, HANDLE hOut, WORD corBase, WORD color, int speed);void SelectSort(int *p, int num, HANDLE hOut, WORD corBase, WORD color, int speed);void InsertSort(int *p, int num, HANDLE hOut, WORD corBase, WORD color, int speed);void PopSort(int *p, int num, HANDLE hOut, WORD corBase, WORD color, int speed);int main(int argc ,char **argv){srand((unsigned int)time(NULL));HANDLE hOut;   //  typedef void *HANDLE;WORD corBase = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE |  FOREGROUND_INTENSITY; //  typedef unsigned short      WORD;hOut = GetStdHandle(STD_OUTPUT_HANDLE);//返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄SetConsoleTextAttribute(hOut, corBase);int num[10];CreateInt(num, 10, 100);while (ShowSort(num, 10, hOut, corBase));getchar();getchar();return 0;}// 生成 num 个范围在 0~max 之间的整数void CreateInt(int *p, int num, int max){puts("生成10个随机数,如下:");for (int i=0; i<10; i++){p[i] = rand()%max;printf("%d ", p[i]);}puts("\n");}// 四种排序函数int ShowSort(int *p, int num, HANDLE hOut, WORD corBase){SetConsoleTextAttribute(hOut, corBase);// 选择排序方法int index;puts("请选择需要演示的排序方法:");puts("1. 比较法 2. 选择法 3. 插入法 4. 冒泡法 0. 退出");scanf("%d", &index);puts("");if (index == 0)return index;// 设置 演示 属性int n;WORD color;puts("选择字体颜色:1. 红色 2. 绿色 3. 蓝色");scanf("%d", &n);if (n == 1)color = FOREGROUND_RED | FOREGROUND_INTENSITY;else if (n == 2)color = FOREGROUND_GREEN | FOREGROUND_INTENSITY;elsecolor = FOREGROUND_BLUE | FOREGROUND_INTENSITY;puts("选择演示速度:1. 快 2. 中 3. 慢");scanf("%d", &n);puts("");// 判断排序方式,执行演示和排序switch (index){case 1:// 比较法排序CompareSort(p, num, hOut, corBase, color, n);break;case 2:// 选择法排序SelectSort(p, num, hOut, corBase, color, n);break;case 3:// 插入法排序InsertSort(p, num, hOut, corBase, color, n);break;case 4:// 冒泡法排序PopSort(p, num, hOut, corBase, color, n);break;default:break;}return index;}// 比较法排序void CompareSort(int *p, int num, HANDLE hOut, WORD corBase, WORD color, int speed){int res[10];for (int i=0; i<num; i++)res[i] = p[i];puts("比较法排序过程,如下:");printf("            ");for (int i=0; i<num; i++)printf("%d ", p[i]);puts("");for (int i=0; i<num-1; i++){printf("第%d轮 结果:", i+1);int tag = 0;for (int j=i+1; j<num; j++){if (res[i] > res[j]){int tmp = res[i];res[i] = res[j];res[j] = tmp;// 输出if (tag == 0)tag = 1;else{printf("            ");}for(int k=0; k<num; k++){if (k <= i)SetConsoleTextAttribute(hOut, color);elseSetConsoleTextAttribute(hOut, corBase);printf("%d ", res[k]);}puts("");Sleep(speed*700);}}}puts("演示完毕\n");}// 选择法排序void SelectSort(int *p, int num, HANDLE hOut, WORD corBase, WORD color, int speed){int res[10];for (int i=0; i<num; i++)res[i] = p[i];puts("选择法排序过程,如下:");printf("            ");for (int i=0; i<num; i++)printf("%d ", p[i]);puts("");for (int i=0; i<num-1; i++){printf("第%d轮 结果:", i+1);int min=i;for (int j=i; j<num; j++){if (res[min] > res[j])min = j;}// 交换int tmp = res[i];res[i] = res[min];res[min] = tmp;// 输出for(int k=0; k<num; k++){if (k <= i)SetConsoleTextAttribute(hOut, color);elseSetConsoleTextAttribute(hOut, corBase);printf("%d ", res[k]);}puts("");Sleep(speed*700);}puts("演示完毕\n");}// 插入法排序void InsertSort(int *p, int num, HANDLE hOut, WORD corBase, WORD color, int speed){int res[11];for (int i=0; i<num+1; i++)res[i] = -1;puts("插入法排序过程,如下:\n");printf("            ");for (int i=0; i<num; i++)printf("%d ", p[i]);puts("");for (int i=0; i<num; i++){printf("第%d轮 结果:", i+1);for(int j=i; j>=0; j--){if (res[j] < p[i]){res[j+1] = p[i];break;}elseres[j+1] = res[j];}// 输出for(int k=1; k<num+1; k++){if (k <= i+1)SetConsoleTextAttribute(hOut, color);elseSetConsoleTextAttribute(hOut, corBase);if (res[k] != -1)printf("%d ", res[k]);}puts("");Sleep(speed*700);}puts("演示完毕\n");}// 冒泡法排序void PopSort(int *p, int num, HANDLE hOut, WORD corBase, WORD color, int speed){int res[10];for (int i=0; i<num; i++)res[i] = p[i];puts("冒泡法排序过程,如下:\n");printf("            ");for (int i=0; i<num; i++)printf("%d ", p[i]);puts("");int tag = 0, tag1 = 0;for(int i=0; i<num-1; i++){SetConsoleTextAttribute(hOut, corBase);printf("第%d轮 结果:", i+1);tag = tag1 = 0;for (int j=0; j<num-i-1; j++){if (res[j] > res[j+1]){int tmp = res[j+1];res[j+1] = res[j];res[j] = tmp;tag = 1;// 输出if (tag1 == 0)tag1 = 1;else{printf("            ");}for(int k=0; k<num; k++){if (k==j+1 || k>(num-i-1))SetConsoleTextAttribute(hOut, color);elseSetConsoleTextAttribute(hOut, corBase);printf("%d ", res[k]);}puts("");Sleep(speed*700);}}if (tag == 0){puts("");break;}}puts("演示完毕\n");}

0 0
原创粉丝点击