//简单选择排序
#include <stdio.h>
#include <string.h> //头文件 将数组进行复制
#include <stdlib.h>
void Simplechoices(int a[])
{
int i;
int j;
int t;
for(i=1;i<=9;i++)
for (j=i+1;j<=10;j++)
if(a[i]>a[j]) //如果前一个数比后一个数大,则利用中间变量t实现两值互换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
printf("排序后的顺序是:\n");
for(i=1;i<=10;i++)
printf("%5d", a[i]); //输出排序后的数组
printf("\n");
}
void fast(int s[],int start,int end)
{
int i,j; //定义变量为基本整型
i=start; //将每组首个元素赋给i
j = end; //将每组末尾元素赋给j
s[0]=s[start]; //设置基准值
while(i<j)
{
while(i<j&&s[0]<s[j])
j--; //位置左移
if(i<j)
{
s[i]=s[j]; //将s[j]放到s[i]的位置上
i++; //位置右移
}
while(i<j&&s[i]<=s[0])
i++; //位置左移
if(i<j)
{
s[j]=s[i]; //将大于基准值的s[j]放到s[i]位置
j--; //位置左移
}
}
s[i]=s[0]; //将基准值放入指定位置
if (start<i)
fast(s,start,j-1); //对分割出的部分递归调用qusort()函数
if (i<end)
fast(s,j+1,end);
}
void bubbling(int a[])
{
int i;
int j;
int t;
for(i=1;i<10;i++) //变量i代表比较的趟数
for(j=1;j<11-i;j++) //变最j代表每趟两两比较的次数
if(a[j]>a[j+1])
{
t=a[j]; //产利用中间变童实现两值互换
a[j]=a[j+1];
a[j+1]=t;
}
printf("排序后的顺序是:\n");
for(i=1;i<=10;i++)
printf("%5d",a[i]); //将胃泡排序后的顺序输出
printf("\n");
}
void BInsertSort(int a[],int size){
int i,j,low = 0,high = 0,mid; //设置mid low high方便进行找到并插入
int temp = 0;
for (i=1; i<size; i++) { //进行排序的趟数 为size-1
low=1; //总是将low设置为0
high=i;
temp=a[i+1]; //temp为将要插入的数字
//采用折半查找法判断插入位置,最终变量 low 表示插入位置
while (low<=high) { //当low和high开始错位的时候,就退出循环
mid=(low+high)/2;
if (a[mid]>temp) {
high=mid-1;
}else{
low=mid+1;
}
}
//有序表中插入位置后的元素统一后移
for (j=i+1; j>low; j--) {
a[j]=a[j-1];
}
a[low]=temp;//插入元素
}
for(int q = 1; q<11;q++)
{
printf("%d ",a[q]);
}
}
void Directinsort(int s[], int n)
{
int i,j;
for(i=2;i<=n;i++) //数组下标从2开始,一直到最后一个元素结束,s[0]做监视哨,s[1]一个数据无可比性
{
s[0]=s[i]; //给监视哨陚值
j=i-1; //确定好该元素最多和哪一位元素进行比较
while(s[0]<s[j]) //当出现待插入元素比最后最后一位元素小的时候,将该元素向后移动
{
s[j+1]=s[j]; //数据右移
j--; //产移向左边一个未比较的数
}
s[j+1]=s[0]; //在确定的位置插入s[i]
}
for(int t=1;t<11;t++)
printf("%d ",s[t]); //将排序后的数组输出
}
void simple(int a[])
{
int i;
int j;
int t;
for(i=1;i<=9;i++)
for (j=i+1;j<=10;j++)
if(a[i]>a[j]) //如果前一个数比后一个数大,则利用中间变量t实现两值互换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
printf("排序后的顺序是:\n");
for(i=1;i<=10;i++)
printf("%5d", a[i]); //输出排序后的数组
printf("\n");
}
void menu()
{
printf("\n1、直接插入排序\n");
printf("2、折半插入排序\n");
printf("3、冒泡排序\n");
printf("4、快速排序\n");
printf("5、简单选择排序\n");
printf("6、显示数组\n");
printf("0、退出程序\n");
}
void main()
{
int x;
int i,a[11]; //定义变量及数组为基本整型
printf("请输入10个数:\n");
for(i=1;i<11;i++)
scanf("%d",&a[i]); //从键盘中输入要排序的10个数字
while(1){
menu();
printf("请输入您要的选择\n");
scanf("%d",&x);
switch(x)
{
case 0:
exit(0);
case 1:
system("cls");
int b[11];
memcpy(b,a,sizeof(int)*11);
Directinsort(b,10);
break;
case 2:
system("cls");
int c[11];
memcpy(c,a,sizeof(int)*11);
BInsertSort(c,10);
break;
case 3:
system("cls");
int d[11];
memcpy(d,a,sizeof(int)*11);
bubbling(d);
break;
case 4:
system("cls");
int e[11];
memcpy(e,a,sizeof(int)*11);
fast(e,1,10);
for(int y = 1;y<11;y++)
{
printf("%d ",e[y]);
}
break;
case 5:
system("cls");
int f[11];
memcpy(f,a,sizeof(int)*11);
Simplechoices(f);
break;
case 6:
{
system("cls");
for(int o = 1;o<11; o++)
{
printf("%d ",a[o]);
}
break;
}
default:
system("cls");
printf("您的输入有误,请重新输入\n");
break;
}
}
}
直接插入、折半插入、冒泡、快速、简单选择等排序方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.