各種排序演算法?

實現以下常用的內部排序演算法並進行效能比較:起泡排序、直接插入排序、簡單選擇排序、快速排序、希爾排序、堆排序。

基本要求:

待排序表的表長不少於100;其中的資料要用偽隨機數產生程式產生;至少要用5組不同的輸入資料作比較;比較的指標為有關鍵字參加的比較次數和關鍵字移動次數(關鍵字交換計為3次移動)。

三.原始碼

#include

#include

#include

#define MAXNUM 10000

long cn[MAXNUM],mn[MAXNUM];

typedef struct

{

int key;

}datatype;

void D_InsertSort(datatype R[],long n)//直接排序

{

long i ,j;

for(i=2;i<=n;i++)

{

cn[0]++;

if(R[i].key

{

R[0]=R[i];mn[0]++;

for(j=i-1;R[0].key

R[j+1]=R[j];

R[j+1]=R[0];

mn[0]+=2;

}

}

}

void Select_Sort(datatype R[],long n)//簡單選擇排序

{

long i,j,k;

for(i=1;i

{

k=i;

for(j=i+1;j<=n;j++)

{

cn[1]++;

if(R[j].key

k=j;

} if(i=k)

{

R[0]=R[k];

R[k]=R[i];

R[i]=R[0];

mn[1]+=3;

}

}

}

void Bubble_Sort(datatype R[],long n)//氣泡排序

{

long i,j;

for(i=1;i

{

for(j=1;j<=n-i;j++)

{

cn[2]++;

if(R[j].key

{

R[0]=R[j];

R[j]=R[j+1];

R[j+1]=R[0];

mn[2]+=3;

}

}

}

}

void HeapAdjust(datatype R[], long s, long t)//堆調整

{

datatype rc;

long i,j;

rc=R[s];

i=s;

for(j=2*i;j<=t;j=2*j)

{

cn[3]++;

if(j

j=j+1;

if(rc.key>R[j].key)

break;

R[i]=R[j];

mn[3]++;

i=j;

}

R[i]=rc;

}

void HeapSort(datatype R[], long n)//堆排序

{

long i;

for(i=n/2;i>0;i--)

HeapAdjust(R,i,n);

for(i=n;i>1;i--)

{

R[0]=R[1];

R[1]=R[i];

R[i]=R[0];

mn[3]+=3;

HeapAdjust(R,1,i-1);

}

}

void Merge(datatype R[],datatype R1[], long s, long m, long t)

{

long i ,j ,k;

i=s;j=m+1;k=s;

while(i<=m&&j<=t)

{

cn[4]++;

if(R[i].key

{

R1[k++]=R[i++];

mn[4]++;

}

else

{

R1[k++]=R[j++];

mn[4]++;

}

}

while(i<=m)

{

R1[k++]=R[i++];

mn[4]++;

}

while(j<=t)

{

R1[k++]=R[j++];

mn[4]++;

}

}

void MSort(datatype R[],datatype R1[], long s,long t)

{

long m; if(s==t)

{

R1[s]=R[s];

mn[4]++;

}

else

{

m=(s+t)/2;

MSort(R,R1,s,m);

MSort(R,R1,m+1,t);

Merge(R1,R,s,m,t);

}

}

void MergeSort(datatype R[],datatype R1[],long n)//歸併排序

{

MSort(R,R1,1,n);

}

long Partition(datatype R[], long low, long high)

{

R[0]=R[low];

mn[5]++;

while(low

{

while(low =R[0].key)

{

cn[5]++;high--;

}

if(low

{

R[low]=R[high];

low++;

mn[5]++;

}

while(low

{

cn[5]++;

low++;

}

if(low

{

R[high]=R[low];

high--;

mn[5]++;

}

}

R[low]=R[0];

mn[5]++;

return low;

}

void Quick_Sort(datatype R[],long s, long t)//快速排序

{

long i;

if(s

{

i=Partition(R,s,t);

Quick_Sort(R,s,i-1);

Quick_Sort(R,i+1,t);

}

}

void prin(datatype R[], long n)

{

long i;

printf("排序結果為:\n");

for(i=1;i<=n;i++)

{

printf("%d ",R[i]);

}

printf("\n");

}

void suiji()

{

long i,n;

datatype

R[MAXNUM]={0};////定義結構陣列

printf("請輸入你要輸入的d個數\n");

scanf("%d",&n);

if(n>500000)

{

printf("超出範圍重新輸入\n");

scanf("%d ",&n);

}

for(i=1;i<=n;i++)

R[i].key=rand()%100;

printf("排序前的元素順序\n");

for(i=1;i

{

printf("%d ",R[i].key);

}

printf("\n");

D_InsertSort(R,n);//直接排序

Select_Sort(R,n);//簡單選擇排序

Bubble_Sort(R,n);//氣泡排序

HeapSort(R,n); //堆排序

datatype R2[MAXNUM]={0};

MergeSort(R,R2,n);

Quick_Sort(R,0,n);//快速排序

prin(R,n);

}

int main()

{

suiji();

printf(" 比較結果 \n");

printf(" 排序方式 比較次數 移動次數\n");

printf(" 直接 %d %d \n",cn[0],mn[0]);

printf(" 簡單選擇排序 %d %d \n",cn[1],mn[1]);

printf(" 冒泡 %d %d \n",cn[2],mn[2]);

printf(" 堆排序 %d %d \n",cn[3],mn[3]);

printf(" 快速排序 %d %d \n",cn[5],mn[5]);

return 0;

}

相關問題答案