zoukankan      html  css  js  c++  java
  • 排序的算法

    下面贴几个简易的代码吧

    直接插入排序

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	int i,j,n;
    	int a[1000];
    	while(scanf("%d",&n)!=EOF)
    	{
    		for(i=1;i<=n;i++)
    		scanf("%d",&a[i]);
    		for(i=2;i<=n;i++)
    		{
    			if(a[i]<a[i-1])
    			{
    				a[0]=a[i];
    				a[i]=a[i-1];
    				for(j=i-2;a[0]<a[j]?1:0;j--)
    				a[j+1]=a[j];  //记录后移
    				a[j+1]=a[0];
    			}
    		}
    		for(i=1;i<=n;i++)
    		printf(i==n?"%d
    ":"%d ",a[i]);
    	}
    	return 0;
    }
    

    希尔排序,也称缩小增量的排序

    #include<stdio.h>
    #include<string.h>
    int dlta[4]={8,4,2,1};
    int n;
    void shellsort(int a[],int dk)
    {
    	int i,j;
    	for(i=dk+1;i<=n;i++)
    	{
    		if(a[i]<a[i-dk])
    		{
    			a[0]=a[i];
    			for(j=i-dk;j>0&&a[0]<a[j]?1:0;j-=dk)
    			a[j+dk]=a[j];
    			a[j+dk]=a[0];
    		}
    	}
    }
    int main()
    {
    	int i;
    	int a[1000];
    	while(scanf("%d",&n)!=EOF)
    	{
    		for(i=1;i<=n;i++)
    		scanf("%d",&a[i]);
    	    for(i=0;i<4;i++)
    		shellsort(a,dlta[i]);
    		for(i=1;i<=n;i++)
    		printf(i==n?"%d
    ":"%d ",a[i]);
    	}
    	return 0;
    }
    

    快速排序

    #include<stdio.h>
    #include<string.h>
    int n;
    int partition(int a[],int low,int high)
    {
    	int pivotkey;
    	a[0]=a[low];
    	pivotkey=a[low];
    	while(low<high)
    	{
    		while(low<high&&a[high]>=pivotkey)
    		high--;
    		a[low]=a[high];
    		while(low<high&&a[low]<=pivotkey)
    		low++;
    		a[high]=a[low];
    	}
    	a[low]=a[0];
    	return low;
    }
    void qsort(int a[],int low,int high)
    {
    	int pivotloc;
    	if(low<high)
    	{
    		pivotloc=partition(a,low,high);
    		qsort(a,low,pivotloc-1);
    		qsort(a,pivotloc+1,high);
    	}
    }
    int main()
    {
    	int i;
    	int a[1000];
    	while(scanf("%d",&n)!=EOF)
    	{
    		for(i=1;i<=n;i++)
    		scanf("%d",&a[i]);
    	    qsort(a,1,n);
    		for(i=1;i<=n;i++)
    		printf(i==n?"%d
    ":"%d ",a[i]);
    	}
    	return 0;
    }
    

    堆排序

    #include<stdio.h>
    #include<string.h>
    int n;
    void heapsort(int a[],int s,int m)  //数组中除了a[s]均满足堆的定义,本函数调整a[s],使其仍为一个大顶堆
    {
    	int j,rc;
    	rc=a[s];
    	for(j=2*s;j<=m;j*=2)  
    	{
    		if(j<m&&a[j]<a[j+1])
    		j++;
    		if(!(rc<a[j]))
    		break;
    		a[s]=a[j];
    		s=j;
    	}
    	a[s]=rc;
    }
    int main()
    {
    	int i,temp;
    	int a[1000];
    	while(scanf("%d",&n)!=EOF)
    	{
    		for(i=1;i<=n;i++)
    		scanf("%d",&a[i]);
    		for(i=n/2;i>=1;i--)
    		heapsort(a,i,n);
    		for(i=n;i>1;i--)
    		{
    			temp=a[i];
    			a[i]=a[1];
    			a[1]=temp;
    		    heapsort(a,1,i-1);
    		}
            for(i=1;i<=n;i++)
    		printf(i==n?"%d
    ":"%d ",a[i]);
    	}
    	return 0;
    }
    

    归并排序

    #include<stdio.h>
    #include<string.h>
    int n;	
    void merge(int c[],int l,int m,int r)
    {
    	int i,j,k;
    	int d[1000];
    	i=l;
    	j=m+1;
    	k=1;
    	while(i<=m&&j<=r)
    	{
    		if(c[i]<=c[j])
    		d[k++]=c[i++];
    		else
    		d[k++]=c[j++];
    	}
    	while(i<=m)
    	d[k++]=c[i++];
    	while(j<=r)
    	d[k++]=c[j++];
    	for(i=l,k=1;i<=r;i++,k++)
        c[i]=d[k];
    }
    void mergesort(int c[],int left,int right)
    {
    	int mid;
    	if(left<right)  //至少有两个元素
    	{
    		mid=(left+right)/2;
    		mergesort(c,left,mid);
    		mergesort(c,mid+1,right);
    		merge(c,left,mid,right);
    	}
    }
    int main()
    {
    	int i;
    	int a[1000];
    	while(scanf("%d",&n)!=EOF)
    	{
    		for(i=1;i<=n;i++)
    		scanf("%d",&a[i]);
    	    mergesort(a,1,n);
            for(i=1;i<=n;i++)
    		printf(i==n?"%d
    ":"%d ",a[i]);
    	}
    	return 0;
    }
    


    
    
  • 相关阅读:
    《20170920-构建之法:现代软件工程-阅读笔记1》
    结对-贪吃蛇项目-开发过程
    个人-GIT使用方法
    团队-爬取豆瓣电影TOP250-开发环境搭建过程
    团队-爬取豆瓣电影TOP250-简单团队一阶段互评
    团队-爬虫电影网站-开发文档
    结对-贪吃蛇游戏-结对项目总结
    课后作业-阅读任务-阅读提问
    结对-贪吃蛇游戏-开发环境搭建过程
    结对编程贪吃蛇项目-结对编项目设计文档
  • 原文地址:https://www.cnblogs.com/wc1903036673/p/3499134.html
Copyright © 2011-2022 走看看