1. 程式人生 > >用C語言實現常見的幾個排序方法

用C語言實現常見的幾個排序方法

//排序方法通過 (函式呼叫) 的方式實現

//(1)直接插入排序

/*
#include <stdio.h>
#define N 100
void Insertsort(int data[],int n)  //實現插入排序方法:
{
int i,j,temp;
for(i=1;i<n;i++)   // 外層迴圈標識並決定待比較的數值
{
/*
if(data[i] < data[i-1])
{
data[0]=data[i];
data[i]=data[i-1];
for(j=i-1;j>0 && data[j]>data[0];j--) // 內層迴圈為待比較數值確定其最終位置
data[j+1]=data[j];
data[j+1]=data[0];
}
*/
/*
temp=data[i];     //暫儲存有序排列的最後一個元素,
for(j=i;j>0 && temp<data[j-1];--j) // 內層迴圈為待比較數值確定其最終位置
{
data[j]=data[j-1];
}
data[j]=temp;
}
}

int main()
{
    int i,n,a[N];
printf("please input a number N is:\n");
scanf("%d",&n);
printf("please input a  original array :\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
Insertsort(a, n);
printf("the sort array is:\n");
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
return 0;
}
*/



//(2) 氣泡排序
/*
#include <stdio.h>
#define N 100
void voidBubblesort(int data[],int n)
{
int i,j,tag,temp;
for(i=0,tag=1;tag==1&&i<n-1;i++) //控制排的次數,有n個數一共可以排n-1次,
{
tag=0;
for(j=1;j<n-i;j++)//控制在一次排序中,兩個數之間的交換排序
if(data[j-1]>data[j])
{
temp=data[j-1];
data[j-1] =data[j];
data[j]=temp;
tag=1;
}
}
}
int main ()
{
int n,i,a[N];
printf("please input an number is N:\n");
scanf("%d",&n);
printf("please input an original a[n]:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
voidBubblesort(a,n);
printf("The sort array a[n]is :\n");
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
return 0;
}
*/



//(3)簡單的選擇排序
/*
#include <stdio.h>
#define N 100
void Selectsort(int data[],int n)
{
int i,j,k,temp;
for(i=0;i<n;i++) //取一個元素記為最小的,與第一個元素交換位置,從而有序
{
k=i;
for(j=i+1;j<n;j++) //從剩下的無序區繼續取元素,與第一個位置的元素比較
if(data[j]<data[k])
k=j;
if(k != i) //如果第一個位置不是最小的,則交換這個位置
{
temp =data[i];
data[i]=data[k];
data[k]=temp;
}
}
}
int main ()
{
int i,n,a[N];
printf("input number N is:\n");
scanf("%d",&n);
printf("input original array a[] is:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
Selectsort(a,n);//呼叫排序方法
printf("The sorted array a[n]  is:\n"); //排序後的元素輸出
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
return 0;
}

*/

//(4)希爾排序

/*
#include <stdio.h>
#include <stdlib.h>
#define N 100

void shellsort(int data[],int n) //假如n=10
{
int *delta,k,i,t,dk,j;
k=n;
delta=(int *)malloc (sizeof(int)*(n/2));//k=n,0所得的k值得序列作為增量序列存入delta
i=0;
do
{
k=k/2;      //k=5
delta[i++] = k;        //這兒有五個子陣列
}
while(k>0);
i=0;
while((dk=delta[i])>0)    //dk等於子陣列的個數
{
for(k=delta[i];k<n;k++)
if(data[k] < data[k-dk])     //將元素data[k] 插入到有序的增量子表中
{
t=data[k];                   //備份待插入的元素
for(j=k-dk;j>=0 && t<data[j];j-=dk)
data[j+dk] =data[j];          //尋找插入位置的同時元素後移
data[j+dk] = t;               //找到插入位置,插入元素

}
i++;
}
}
*/
/*
int main ()
{
int i,n,a[N];
printf("input number N is:\n");
scanf("%d",&n);
printf("input original array a[] is:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
shellsort(a,n);//呼叫排序方法
printf("The sorted array a[n]  is:\n"); //排序後的元素輸出
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
return 0;
}
*/

//(5) 快速排序
/*
#include <stdio.h>
#define N 100
void quicksort(int data[],int low,int high)
{
int i,pivot,j;
if(low<high)  //判斷陣列中是否有多個元素
{
pivot=data[low];//記錄一個元素
i=low;
j=high;
while(i<j)
{
while(i<j && data[j]>pivot)//從最後一個元素開始,如果這個這個元素比記錄的元素小,兩個元素就互換位置
j--;
if(i<j)
data[i++] =data[j];
while(i<j && data[i]<pivot)//然後從前開始向後移動,找到一個比記錄大的元素時,兩個元素繼續互換位置
i++;
if(i<j)
data[j--] = data[i];
}
data[i] =pivot;//遞迴實現其他元素的比較
quicksort(data,low,i-1);
quicksort(data,i+1,high);
}
}

int main ()
{
int i,n,a[N];
printf("input number N is:\n");
scanf("%d",&n);
printf("input original array a[] is:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
quicksort(a,0,n);//呼叫排序方法
printf("The sorted array a[n]  is:\n"); //排序後的元素輸出
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
return 0;
}
*/


//(6)歸併排序

#include <stdio.h>
#define N 10
void Merge(int data1[],int data2[],int i,int m,int n) //實現兩個陣列的歸併
{
int j,k,l;
for(j=m+1,k=i;i<=m && j<=n;k++) //先把較小的陣列新增到陣列中
if(data1[i] < data1[j])
data2[k]=data1[i++];
else
data2[k]=data1[j++];
if(i<=m)                        //新增陣列剩餘的元素
for(l=0;l<=m-i;l++)
data2[k+1] = data1[i+1];
if(j<=n)                        //新增剩餘陣列的元素
for(l=0;l<=n-j;l++)
data2[k+1] = data1[j+1];
}

void Msort(int data1[],int data2[],int s,int t) //實現陣列的排序
{
int m;
int data3[10];
if(s==t)
data2[s] =data1[s];
else
{
m=(s+t)/2;
Msort(data1,data3,s,m); //遞迴實現排序
Msort(data1,data3,m+1,t);
Merge(data3,data2,s,m,t);//合併排序後的陣列

}
}

void main()
{
    int i,n,b[N],a[N];
    printf("please input a number is N :\n");
    scanf("%d",&n);
    printf("please input a original array a[]:\n");
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
Msort(a,b,0,n); //呼叫排序方法,實現排序
    for(i=0;i<N;i++)
        printf("%3d",b[i]);
    printf("\n");
}