C语言的经典排序算法源码

1插入排序:插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。代码如下:

#include<stdio.h>

void main()

{

int a[10];

int i,j,k;

printf("请输入10个数字!空格隔开\n");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

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

{

k=a[i];

j=i-1;

while((j>=0)&&(a[j]>k))

{

a[j+1]=a[j];

j--;

}

a[j+1]=k;

}

printf("你输入的数字按照插入排序法由小到大排序后为\n");

for(i=0;i<10;i++)

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

printf("\n");

}

2快速排序:快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。代码如下:

 

#include<stdio.h>

void main()

{

int a[10];

int i;

int p(int a[],int low,int high);

void q(int a[],int low,int high);

printf("请输入10个数字,用空格隔开!!\n");

for(i=0;i<10;i++)

scanf("%d",&a[i]);



printf("快速排序法由小到大排序后:\n");

for(i=0;i<10;i++)

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

int p(int a[],int low,int high);

{

int key=a[low],p;

while(low<high)

{

while(low<high && a[high]>=key)

--high;

p=a[low];a[low]=a[high];a[high]=p;

while(low<high && a[low]<=key)

++low;

p=a[high];a[high]=a[low];a[low]=p;

}

a[low]=key;

return low;

}



void q(int a[],int low,int high);

{

int j;

if(low<high)

{

j=p(a,low,high);

q(a,low,j-1);

q(a,j+1,high);

}

}

}

3冒泡排序:冒泡法大家都较熟悉。其原理为从a[0]开始,依次将其和后面的元素比较,a[0]>a[i],则交换它们,一直比较到a[n]。同理对a[1],a[2],...a[n-1]处理,即完成排序。代码如下:

 

#include<stdio.h>

void main()

{

int a[10];

int i,j,k;

printf("请输入10个数,用空格隔开!!\n");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

for(i=0;i<9;i++)

for(j=0;j<9-i;j++)

if(a[j]>a[j+1])

{

k=a[j];

a[j]=a[j+1];

a[j+1]=k;

}

printf("冒泡排序法由小到大排序后:\n");

for(i=0;i<10;i++)

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

printf("\n");

}

4希尔排序:shell法是一个叫 shell 的美国人与1969年发明的。它首先把相距k(k>=1)的那几个元素排好序,再缩小k值(一般取其一半),再排序,直到k=1时完成排序。代码如下:

 

#include<stdio.h>

void main()

{

int a[10];

int i,j,k=9,t;

printf("请输入10个数字:之间用空格隔开!!!\n");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

while(k>0)

{

for(i=k;i<10;i++)

{

j=i-k;

while(j>=0)

if(a[j]>a[j+k])

{

t=a[j];

a[j]=a[j+k];

a[j+k]=t;

}

else break;

}

k/=2;

}

printf("你输入的数字希尔排序由小到大排序为:\n");

for(i=0;i<10;i++)

printf("%4d",a[i]);

printf("\n");

}

5选择排序:选择法循环过程与冒泡法一致,它还定义了记号k=i,然后依次把a[k]同后面元素比较,若a[k]>a[j],则使k=j.最后看看k=i是否还成立,不成立则交换a[k],a[i],这样就比冒泡法省下许多无用的交换,提高了效率。代码如下:

#include<stdio.h>

void main()

{

int a[10];

int i,j,k,m;

printf("请输入10个数字,数字间用空格隔开!!\n");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

for(i=0;i<9;i++)

{

k=i;

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

if(a[k]>a[j])

k=j;

if(k!=i)

{

m=a[i];

a[i]=a[k];

a[k]=m;

}

}

printf("由选择法由小到大排序后:\n");

for(i=0;i<10;i++)

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

printf("\n");

}

你可能感兴趣的:(排序算法)