需求分析:
需求1:需要设定一个大小和元素都可以自设的数组。
需求2:需要六种排序算法。
需求3:需要设定一个选择结构。
需求4:能循环使用 (没说自己加的)
(1) 选择是否进入系统
(2) 输入要设计数组得大小
(3) 给数组中输入元素
(4) 选择排序得方法
(5) 输出结果
(6) 清屏并返回(1)操作
{
printf("\n\n 选择排序方法,用该方法排序并输出:
\n 0.简单排序
\n 1.直接插入排序
\n 2.冒泡排序
\n 3.快速排序
\n 4.归并排序
\n 5.堆排序
\n 6.退出\n");
scanf("%d",&n2);
switch(n2)
{
case 0:{SelectSort(a, n1);Print(a,n1);} break; //简单排序
case 1:{InsertSort(a, n1);Print(a,n1);} break; //直接插入排序
case 2:{bubbling_sort(a,n1);Print(a,n1);}break; //冒泡排序
case 3:{quickSort(a, 0, n1-1);Print(a,n1);} break; //快速排序
case 4:{MergeSort(a, b, n1);Print(b,n1);}break; //归并排序
case 5: {HeapSort(a,n1);Print(a,n1);}break; //堆排序
case 6:{flag=0;}break;
default:printf("请输入(0~6)范围之内的数字");
}
system("pause");
system("cls"); }break;
case 1:return 0;break;
}
先利用switch语句设置一排序系统进入界面,进入选0,退出选1;
选择0进入case 0:后{}中的排序系统;代码为上面的重要代码片段
选择要采用的排序算法,因为有system(“pause”);代码,所以在结果界面会停下;
最后system(“cls”);清屏
#include
#include
#define MAXSIZE 100
void Print(int a[],int n)
{
printf("排序后的结果为: ");
for (int j = 0; j a[j])
k = j;
}
return k;
}
void SelectSort(int a[], int n) {
int key, tmp;
for (int i = 0; i < n-1; i++) {
key = SelectMinKey(a, n, i); //选择最小的元素
if (key != i) {
tmp = a[i];
a[i] = a[key];
a[key] = tmp; //最小元素与第i位置元素互换
}
}
}
//直接插入排序
void InsertSort(int a[], int n)
{
for (int i = 1; i a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
//快速排序
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int partition(int a[], int low, int high)
{
int privotKey = a[low]; //基准元素
while (low < high)
{ //从表的两端交替地向中间扫描
while (low < high && a[high] >= privotKey) --high; //从high 所指位置向前搜索,至多到low+1 位置。将比基准元素小的交换到低端
swap(&a[low], &a[high]);
while (low < high && a[low] <= privotKey) ++low;
swap(&a[low], &a[high]);
}
return low;
}
void quickSort(int a[], int low, int high)
{
if (low < high)
{
int privotLoc = partition(a, low, high); //将表一分为二
quickSort(a, low, privotLoc - 1); //递归对低子表递归排序
quickSort(a, privotLoc + 1, high); //递归对高子表递归排序
}
}
//归并排序
void Merge(int *r,int *rf, int i, int m, int n)
{
int j,k;
for(j=m+1,k=i; i<=m && j <=n ; ++k){
if(r[j] < r[i]) rf[k] = r[j++];
else rf[k] = r[i++];
}
while(i <= m) rf[k++] = r[i++];
while(j <= n) rf[k++] = r[j++];
}
void MergeSort(int *r, int *rf, int lenght)
{
int len = 1;
int *q = r ;
int *tmp ;
while(len < lenght) {
int s = len;
len = 2 * s ;
int i = 0;
while(i+ len = 0; --i)
HeapAdjust(H,i,length);
}
/**
* 堆排序算法
*/
void HeapSort(int H[],int length)
{
//初始堆
BuildingHeap(H, length);
//从最后一个元素开始对序列进行调整
for (int i = length - 1; i > 0; --i)
{
//交换堆顶元素H[0]和堆中最后一个元素
int temp = H[i]; H[i] = H[0]; H[0] = temp;
//每次交换堆顶元素和堆中最后一个元素之后,都要对堆进行调整
HeapAdjust(H,0,i);
}
}
int main()
{
int a[MAXSIZE];
int b[MAXSIZE];
int key;
int n1,n2;
int flag=1;
while(flag)
{
printf("------------欢迎来到排序系统-------------\n");
printf("| |\n");
printf("|----0.进入系统---------1.退出系统------|\n");
printf("| |\n");
printf("-----------------------------------------\n");
scanf("%d",&key);
switch(key)
{
case 0:{
printf("请输入您要输入数组的大小:");
scanf("%d",&n1);
if(n1<=0)
{
printf("输入数字不符合要求,请重新输入(大于0):\n ");
scanf("%d",&n1);
}
printf("请依次输入数据:");
for(int i=0;i