用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");
}




  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值