几种排序算法的C语言实现

最近在学习算法导论;前两章讲的是排序的问题,就在博客上一下几个算法的思路和代码,当做是个练习吧。首先写

两个生成数据和打印数据的函数。

#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
         void generate(int a[],int n) { srand(time(0)); for (int i=0;i 
         
       
      
      
     
     
    
    
   
   

<一>插入排序;插入排序的思想很容易理解,就想打牌的时候一样;我们总是从从还没排好序的那一部分里找一个数

,把它插入到已经排好序的那一部分,这样这个数就从未排好序的那部分进入了排好序的那一部分;如此交替,知道每个数

都已经在排好序的那一部分里。分析复杂度:在最好情况下O(n),最坏情况之O(n^2)

代码如下:



void sort(int a[],int n);
void main()
{

	extern void generate(int[],int);
	extern void print(int[],int);
	int a[50];
    generate(a,50);
	print(a,50);
	sort(a,50);
	print(a,50);
}

void sort(int a[],int n)
{
	int i,j,temp;
	for(j=1;j
    
    
     
     =0;i--)
		{
			if(a[i]>temp)
			{
				a[i+1]=a[i];
			}
			else 
				break;
		}
		a[i+1]=temp;
	}
}
		

    
    
<二>选择排序:这个方法来自于第二章练习题:首先找出A中最小元素,与A[0]交换,然后找出A中次小元素,与A[1]交换。。。。

代码如下:最好或最坏情况下都是O(n^2)


void sort(int a[],int n);
int find(int a[],int n,int i);
void main()
{

	extern void generate(int[],int);
	extern void print(int[],int);
	int a[100];
    generate(a,100);
	print(a,100);
	sort(a,100);
	print(a,100);
}

void sort(int a[],int n)
{
	int i,j;
	for(i=0;i
    
    
<三>合并算法:用分治的方法,把每个序列分成两个序列,再分别对两个序列排序,然后将排好序的子序列合并;合并用到了
了递归(分治)的思想,为了研究复杂度,写出递归式。T(n)=2T(n/2)+O(n); O(n)是将两个排好序的子序列合并时的复杂度;
根据二叉树的启示,我们可以构造一个深度为lgn+1的二叉树,每一次都有cn的操作,总的复杂度为O(nlgn)

#include 
     
     
      
      

void sort(int a[],int p,int r);
void merge(int a[],int p,int q,int n);
void main()
{

	extern void generate(int[],int);
	extern void print(int[],int);
	int a[100];
    generate(a,100);
	print(a,100);
	sort(a,0,100);
	print(a,100);
}

void sort(int a[],int p,int r)
{
	int q;
	if(p
      
      
     
     

<四>合并排序和插入排序;已经发现在一定范围内,nlgn>n^2;所以在先使用合并算法,当
n较小时,插入排序。
#include 
       
       
        
        

void sort(int a[],int p,int r);
void merge(int a[],int p,int q,int n);
void sort2(int a[],int p,int r);
void main()
{

	extern void generate(int[],int);
	extern void print(int[],int);
	int a[100];
    generate(a,100);
	print(a,100);
	sort(a,0,100);
	print(a,100);
}

void sort(int a[],int p,int r)
{
	int q;
	if(p<(r-40))
	{
		if(p
        
        
         
         =0;i--)
		{
			if(a[p+i]>temp)
				a[p+i+1]=a[p+i];
			else break;
		}
		a[p+i+1]=temp;
	}
}

        
        
       
       


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值