`
Touch_2011
  • 浏览: 290477 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

各种排序算法的实现(C语言实现)

阅读更多
/*
 * 各种基本排序算法实现(以由小到大为例)
 */

#include<stdio.h>
#define ARRAY_LENGTH 50 

//插入排序
void inseartSort(int a[],int length)
{
	int i,j,index,temp;
	for(i=0;i<length;i++){//数组a中元素逐个有序插入数组a
		for(j=0;j<i;j++) //寻找第i个元素的插入位置
			if(a[i]<a[j])
				break;
		index=j;
		temp=a[i];
		for(j=i;j>index;j--)//移位
			a[j]=a[j-1];
		a[index]=temp;
	}
}

//快速排序
void quickSort(int a[],int length)
{
    int i=0,j=length-1; //i指向数组头元素,j指向数组尾元素
	int index=0;     //指向中间值
	int m=0;         //双向搜索,判断是i加还是j减
	if(length<=0)
		return;
	while(i<=j){ //一趟快速排序
		if(!m){
            if(a[j]<a[index]){//交换a[j]和a[index]
    			a[j]=a[index]+a[j];
	    		a[index]=a[j]-a[index];
	    		a[j]=a[j]-a[index];
		     	index=j;
				m=1;
			}
        	j--;
		}else{
			if(a[i]>a[index]){
    			a[i]=a[index]+a[i];
	    		a[index]=a[i]-a[index];
	    		a[i]=a[i]-a[index];
		     	index=i;
				m=0;
			}
			i++;
		}
	}
	quickSort(a,index);
	quickSort(a+index+1,length-index-1);
}

//希尔排序
void shellSort(int a[],int length)
{
	int b[ARRAY_LENGTH]; //辅助数组
	int d,k,j,i;
	d=length/2;          //增量
	while(d>0){
		for(k=0;k<d;k++){
			j=0;
			for(i=k;i<length;i+=d)//把a中要排序的元素复制到b数组
				b[j++]=a[i];
			inseartSort(b,j);
			j=0;
			for(i=k;i<length;i+=d)//把排好序的元素放回a数组
				a[i]=b[j++];
		}
		if(d==1)//增量为1,最后一趟插入排序排完
		    break;
		d/=2;
		if(d==0)
			d=1;
	}
}

//归并排序
void mergeSort(int a[],int length)
{
	int d=2,i; //d为归并的子列中每一个子列包含的元素个数
	while(d<length){
		for(i=0;i+d<=length;i+=d) //一趟归并
			inseartSort(a+i,d);
		d*=2;
	}
	//收尾处理,因为可能有没处理完的子列(这个子列的元素个数小于d)
	inseartSort(a,length); 
}

//基数排序
void radixSort(int a[],int length)
{
	int b[ARRAY_LENGTH]; //存放a中元素取出的各个位数上的数字
	int i,index,j,temp,step=1;
    for(i=0;i<length;i++)//a中各个元素复制到b
    	b[i]=a[i];

    while(1){
    	for(i=0;i<length;i++)//取b中各个元素的个位数
    		b[i]=b[i]%10;
    	//对b数组进行排序,a数组按各个位数上的数字大小进行排序
        for(i=0;i<length;i++){
            index=i;
    		for(j=i;j<length;j++)
	    		if(b[j]<b[index])
		    		index=j;
    		temp=b[i];
    		b[i]=b[index];
     		b[index]=temp;
    		temp=a[i];
    		a[i]=a[index];
    		a[index]=temp;
		}
    	for(i=0;i<length;i++)
    		b[i]=a[i]/(10*step);

    	for(i=0;i<length;i++)//判断b中的元素是否全是0
	    	if(b[i]!=0)
	    		break;
    	if(i==length)//b中元素全是0
    		break;
		step*=10;
	}
}


/*********************** 以下是堆排序的实现 ***********************/

//筛选法调整堆,i指向要调整的元素
void sift(int a[],int length,int i)
{
	int j=2*(i+1)-1;  //j指向i的左孩子
	int index=j;    //index指向某个元素的左右孩子中较大的一个
	int temp;
	if(j>=length) //i为叶子节点
		return;
	if(j+1<length)
    	index=a[j]>a[j+1]?j:j+1;
	if(a[i]<a[index]){//如果父亲结点小于孩子结点,交换
       temp=a[i];
	   a[i]=a[index];
	   a[index]=temp;
	   sift(a,length,index); //可能破坏了左子树或右子树的排序,对子树进行筛选法调整
	}
}

//堆排序(大顶堆)
void heapSort(int a[],int length)
{
	int i; //i指向要调整的元素,从length/2开始
    int temp;

	//从length/2个元素开始调整堆
	for(i=length/2-1;i>=0;i--){
        sift(a,length,i);
	}

	//取堆顶元素,最后一个元素代替第一个元素。然后调整堆 
	for(i=length-1;i>0;i--){
		temp=a[0];
		a[0]=a[i];
		a[i]=temp;
		sift(a,i,0);
	}
}
/*********************** 以上是堆排序的实现 ***********************/


void main()
{
	int i;
	int a[]={5,3,5,6,12,33,24,10,22,8};
	int b[10];

	//待排序序列
	printf("待排序序列:");
    for(i=0;i<10;i++)
		b[i]=a[i];
	for(i=0;i<10;i++)
		printf("%-4d",b[i]);
    printf("\n\n");

	//测试插入排序
	printf("插入排序  :");
	inseartSort(b,10);
	for(i=0;i<10;i++)
		printf("%-4d",b[i]);
    printf("\n\n");

	//测试快速排序
	printf("快速排序  :");
    for(i=0;i<10;i++)
		b[i]=a[i];
	quickSort(b,10);
	for(i=0;i<10;i++)
		printf("%-4d",b[i]);
    printf("\n\n");

	//测试希尔排序
	printf("希尔排序  :");
    for(i=0;i<10;i++)
		b[i]=a[i];
	shellSort(b,10);
	for(i=0;i<10;i++)
		printf("%-4d",b[i]);
    printf("\n\n");

	//测试归并排序
	printf("归并排序  :");
    for(i=0;i<10;i++)
		b[i]=a[i];
	mergeSort(b,10);
	for(i=0;i<10;i++)
		printf("%-4d",b[i]);
    printf("\n\n");

	//测试基数排序
	printf("基数排序  :");
    for(i=0;i<10;i++)
		b[i]=a[i];
	radixSort(b,10);
	for(i=0;i<10;i++)
		printf("%-4d",b[i]);
    printf("\n\n");

	//测试堆排序
	printf("堆排序    :");
    for(i=0;i<10;i++)
		b[i]=a[i];
	heapSort(b,10);
	for(i=0;i<10;i++)
		printf("%-4d",b[i]);
    printf("\n\n");
}

 

0
0
分享到:
评论

相关推荐

    各种常用排序算法的C语言实现

    本资源提供了各种常用排序算法的C语言实现,源自严蔚敏的经典教材《数据结构》。下面将详细介绍这些排序算法及其在C语言中的实现原理。 1. 冒泡排序(Bubble Sort) 冒泡排序是最基础的排序方法,通过不断交换相邻...

    二叉树建立遍历冒泡排序快速排序算法:C语言编程实现10个数据结构课程设计实例.zip

    二叉树建立遍历冒泡排序快速排序算法:C语言编程实现10个数据结构课程设计实例.zip 二叉树建立遍历冒泡排序快速排序算法:C语言编程实现10个数据结构课程设计实例.zip 二叉树建立遍历冒泡排序快速排序算法:C语言...

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

    一些常用排序算法的C语言实现,包括直接选择排序,希尔排序,直接插入排序,快速排序,归并排序,冒泡排序,堆排序

    各种排序算法c语言实现

    根据给定文件的信息,我们可以详细地探讨几种不同的排序算法及其在C语言中的实现方式。这里主要涉及的选择排序、直接插入排序、冒泡排序以及堆排序是计算机科学领域中非常基础且重要的排序方法。 ### 一、选择排序 ...

    堆排序算法 C语言实现

    C语言实现的堆排序算法。 提供了堆排序算法的一个接口,可以为其它功能提供功能。

    冒泡排序算法的C语言实现

    冒泡排序算法两种C语言实现方法,在VC开发环境下验证通过

    排序算法(C语言实现)

    本资源提供了三种经典的排序算法的C语言实现:堆排序、直接插入排序和快速排序。 首先,让我们详细了解这些排序算法。 1. **直接插入排序**: 直接插入排序是一种简单的排序算法,它的工作原理类似于我们手动排序...

    冒泡,选择,插入排序算法c语言实现

    冒泡排序算法选择排序算法插入排序c语言实现

    各种并行排序算法的C语言实现代码

    总的来说,"各种并行排序算法的C语言实现代码"这个压缩包提供了丰富的学习材料,可以帮助开发者理解和掌握并行排序的实现技术。通过对这些源代码的研究,我们可以更好地应用并行计算,提升大规模数据处理的效率。

    经典排序算法(C语言实现).zip

    本项目“经典排序算法(C语言实现)”提供了C语言版本的多种常见排序算法实现,对于学习和理解排序算法有极大的帮助。下面我们将深入探讨这些排序算法的核心原理及其C语言实现。 1. 冒泡排序(Bubble Sort) 冒泡...

    合并排序算法的C语言实现

    合并排序算法的C语言实现,在VC开发环境下验证通过

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

    本资源提供的是C语言实现的各种排序算法,其中包括快速排序(Quick Sort)算法,同时也考虑了在大量数据中快速找到最大N个数的场景。 首先,让我们来探讨一下排序算法。排序是指将一组数据按照特定的顺序排列,常见...

    二叉排序树算法实现C语言

    数据结构中的二叉排序树实现算法,C语言~~~~~~~~~~~~

    算法:C语言实现(第1~4部分)答案

    - 第一部分可能包含简单的排序算法,如冒泡排序、选择排序或插入排序。这些是最基础的算法,帮助初学者理解排序过程。 - 冒泡排序通过不断交换相邻的错误顺序元素来逐步排序数组。 - 选择排序每次找出未排序部分...

    排序算法实现C语言.docx

    排序算法实现

    7种简单排序算法的C语言实现

    在这个压缩包文件"sort_0512"中,包含了七种经典的排序算法的C语言实现,分别是冒泡排序、插入排序、选择排序、希尔排序、快速排序、归并排序和堆排序。接下来,我们将对这些排序算法进行深入的探讨。** **1. 冒泡...

    排序算法的c语言实现

    本资源“排序算法的C语言实现”提供了一系列经典的排序算法,包括插入排序、选择排序、冒泡排序、快速排序和归并排序。下面将详细介绍这些排序算法及其C语言实现的关键点。 1. 插入排序(Insertion Sort): 插入...

    常见经典排序算法(C语言)

    常见经典排序算法(C语言)

    算法:C语言实现

    《算法:C语言实现(第1-4部分)基础知识、数据结构、排序及搜索(原书第3版)》细腻讲解计算机算法的C语言实现。全书分为四部分,共16章。包括基本算法分析原理,基本数据结构、抽象数据结构、递归和树等数据结构知识,...

    归并排序算法C语言实现

    完整的实现了归并排序的算法,使用C语言实现,相信看过本程序之后,会对归并排序了如指掌

Global site tag (gtag.js) - Google Analytics