//簡單選擇排序
#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;
}
}
}
直接插入、折半插入、冒泡、快速、簡單選擇等排序方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.