五種排序方法:
插入排序 希爾排序 冒泡排序 選擇排序 快速排序
#include "stdio.h"
#include "stdlib.h"
#include<time.h>
#define random(x) (rand()%x)
#define Max 100
typedef int sqlist[Max+1];
int rand_100()//亂數生成,范圍:1-100
{
return random(100);
}
//直接插入排序
//每趟排序將一個待排序的記錄按其關鍵碼的大小插入到已經排好序的有序序列中,直到全部記錄排好序,
void insertsort(sqlist a, int n)
{
int i,j;
for(i=2; i<=n; i++)//n次排序
{
int temp=a[i];//暫存待插入的記錄
for(j=i-1; j>=0&&temp<a[j]; j--)//尋找插入位置
a[j+1]=a[j];
a[j+1]=temp;
}
}
//希爾排序(直接插入排序的改進)
//先將整個待排序記錄序列分割成若干個子序列,在子序列內分別進行直接插入排序,待整個序列基本有序時,再對全體記錄進行一次直接插入排序,
void shellsort(sqlist r,int n)
{
int i,j,gap,x;
gap=n/2;//子空間初始長度
while(gap>0)//子空間為零時結束回圈
{
for(i=gap+1; i<=n; i++)
{
x=r[i];
for(j=i-gap; j>=1 && x<r[j]; j=j-gap)
{
r[j+gap]=r[j];
}
r[j+gap]=x;
}
gap=gap/2;
}
}
//冒泡排序
//兩兩比較相鄰記錄,如果反序則交換,直到沒有反序的記錄為止
void bubblesort(sqlist r,int n)
{
int i,j,w;
for(i=1; i<=n-1; i++)
for(j=n; j>=i+1; j--)
if(r[j]<r[j-1])
{
w=r[j];
r[j]=r[j-1];
r[j-1]=w;
}
}
//選擇排序
//每趟排序在當前待排序序列中選出最小的記錄,添加到有序序列中
void selectsort(sqlist r, int n)
{
int i,j,k,temp;
for(i=1; i<=n-1; i++)
{
k=i;
for(j=i+1; j<=n; j++)
if(r[j]<r[k]) k=j;
temp=r[i];
r[i]=r[k];
r[k]=temp;
}
}
int partion( sqlist a, int n, int low, int high)
{
int p; //軸值
p=a[low];
a[0]=a[low];//記錄下軸值位置
while(low<high)
{
while(low<high && a[high]>=p) --high; //右側掃描,從后往前尋找,找到一個比軸值小的記錄,最后一個記錄到這個記錄中間所有記錄都比軸值大
a[low]=a[high];
while(low<high && a[low]<=p) ++low; //左側掃描,從前往后找,找到一個比軸值大的記錄,第一個記錄到這個記錄中間所有記錄都比軸值小
a[high]=a[low];
}
a[low]=a[0];//劃分結束后將軸值賦值給最終位置
return low;//軸值最終位置
}
//快速排序,對冒泡排序的一種改進
//首先確定一個軸值(即比較的基準),將待排序記錄劃分成兩部分,左側記錄均小于或等于軸值,右側記錄均大于或等于軸值,然后分別對這兩部分重復上述程序,直到整個序列有序,
//快速排序是一個遞回程序,
void quicksort(sqlist a, int n, int low, int high)
{
int p;
if (low<high)
{
p=partion(a,n,low,high);
quicksort(a,n,low,p-1);
quicksort(a,n,p+1,high);
}
}
sqlist& rand_10(sqlist &a)//隨機生成10個1-100的數
{
for (int i=1;i<=10;i++)
a[i]=rand_100();
printf ("當前陣列為:\n" );
for (i=1;i<=10;i++)
printf ("%5d",a[i] );
printf ("\n" );
return a;
}
//28 49 44 89 43 49 90 56 24 21
void main()
{
srand((int)time(0));//設定種子
int i,n=10;
sqlist a;
rand_10(a);
printf ("插入排序的結果是:\n" );
insertsort(a,n);
for (i=1;i<=10;i++)
printf ("%5d",a[i]);
printf ("\n\n");
rand_10(a);
printf ("希爾排序的結果是:\n" );
shellsort(a,n);
for (i=1;i<=10;i++)
printf ("%5d",a[i]);
printf ("\n\n");
rand_10(a);
printf ("冒泡排序的結果是:\n" );
bubblesort(a,n);
for (i=1;i<=10;i++)
printf ("%5d",a[i]);
printf ("\n\n");
rand_10(a);
printf ("選擇排序的結果是:\n" );
selectsort(a,n);
for (i=1;i<=10;i++)
printf ("%5d",a[i]);
printf ("\n\n");
rand_10(a);
printf ("快速排序的結果是:\n" );
quicksort(a,n,1,n);
for (i=1;i<=10;i++)
printf ("%5d",a[i]);
printf ("\n\n");
return;
}
最后,如果覺得這篇博客能幫助到你,請點個小小的贊支持一下我(收藏也行呀,嘻嘻),這是我繼續更新的動力呀,關注我可以得到第一時間的更新,更加快人一步哦,
如果有問題請在評論區留言,一起交流進步,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/282404.html
標籤:其他
上一篇:error LNK2019: 無法決議的外部符號_SeqListPushBack,該符號在函式 _SeqListTest1 中被參考
