iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言所有经典排序方法的实现代码
  • 410
分享到

C语言所有经典排序方法的实现代码

2024-04-02 19:04:59 410人浏览 泡泡鱼
摘要

运行结果正确 还是快速排序难一些。 完整代码 #include<stdio.h> #include <stdlib.h> #include <st

运行结果正确
还是快速排序难一些。

在这里插入图片描述

完整代码


#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include<malloc.h>
void swap(int *a,int *b);
void select_sort(int arr[],int n);
void tra_arr(int arr[],int n);
void insert_sort(int arr[],int n); 
void shell_sort(int arr[],int n);
void perc_down(int arr[],int i,int n);
void heap_sort(int arr[],int n);
void merge(int arr[],int temp_arr[],int left_start,int right_start
			,int right_end);
void m_sort(int arr[],int temp_arr[],int left,int right);
void merge_sort(int arr[],int n);
int get_pri(int arr[],int left,int right);
void q_sort(int arr[],int left,int right);
void quick_sort(int arr[],int n);
int main(){
	int arr[100]={
		10,9,8,7,6,5,4,3,2,1
	};
	select_sort(arr,10);
	printf("\n简单选择排序结果\n");
	tra_arr(arr,10);
	
	int arr1[100]={
		10,9,8,7,6,5,4,3,2,1
	};
	insert_sort(arr1,10);
	printf("\n插入排序结果\n");
	tra_arr(arr1,10);
	
	int arr2[100]={
		10,9,8,7,6,5,4,3,2,1
	};
	shell_sort(arr2,10);
	printf("\n希尔排序结果\n");
	tra_arr(arr2,10);
	
	int arr3[100]={
		10,9,8,7,6,5,4,3,2,1
	};
	heap_sort(arr3,10);
	printf("\n堆排序结果\n");
	tra_arr(arr3,10);
	
	int arr4[100]={
		 10,9,8,7,6,5,4,3,2,1
	};
	merge_sort(arr4,10);
	printf("\n归并排序结果\n");
	tra_arr(arr4,10);
	
	int arr5[100]={
		 10,9,8,7,6,5,4,3,2,1
	};
	quick_sort(arr5,10);
	printf("\n快速排序结果\n");
	tra_arr(arr5,10);
	
	return 0;
}
void swap(int *a,int *b){
	//在函数内部,如果打算接收的是指针的地址,那就不要加*,
	//如果想要的是值,那就加*,我也很讨厌指针,但是没办法 
	int t=*a;
	*a=*b;
	*b=t;
}
//简单选择排序 
void select_sort(int arr[],int n){
	int min;
	//这个过程一时半会讲不清楚,看书会清楚一些 
	for(int i=0;i<n;i++){
		min=i;
		
		for(int j=i+1;j<n;j++){
			if(arr[i]>arr[j]){
				min=j;
			}
		} 
		//经过上面的里层for,就找到了最小的元素的下表
		swap(&arr[i],&arr[min]) ;
	} 
}
//插入排序
void insert_sort(int arr[],int n){
	int temp,j;
	for(int i=1;i<n;i++){
		temp=arr[i];
		for(j=i;j>0&&arr[j-1]>temp;j--){
			//后挪
			arr[j]=arr[j-1];
		}
		//现在就找到空出来的插入位置了
		arr[j]=temp; 
	}
} 
//希尔排序
void shell_sort(int arr[],int n){
	int in,i,j,temp;
	//本来这个排序是很好理解的,就是这个外层的循环
	//故弄玄虚,你就把他理解成一个简单的,递减的数组就行
	//而且这个2的指数递减的序列的时间复杂度是很坏的 
	//最好使用SED或者HIB序列会好很多,这里只是演示 
	//两个里层的for就是插入排序,仔细看看就能看懂 
	
	for(in=n/2;in>0;in=in/2){
		for(i=in;i<n;i++){
			temp=arr[i];
			for(j=i;j>=in;j=j-in){
				if(arr[j-in]>temp){
					//后挪 
					arr[j]=arr[j-in];
				}
				else{
					//arr[j-in]<temp,说明找到了 
					break;
				}
			}
			//上面执行完,肯定找到了插入位置
			arr[j]=temp; 
		}
	} 
} 
//首先是下滤操作
//i是根,n是heap的规模 
//这里的下滤针对最大堆 
void perc_down(int arr[],int i,int n){
	int child,temp;
	//仔细想想,其实和插入排序差不多
	//首先把i取出来,把i在堆里面所在的位置空出来 
	//这里和原来建堆的下滤又不一样,这里没有设置哨兵 
	for(temp=arr[i];(2*i+1)<n;i=child){
		child=2*i+1;
		//如果当前儿子不是最后一个,说明还有右儿子
		//两者取最大 
		if(child!=(n-1)&&arr[child]<arr[child+1]){
			child++;
		}
		if(temp<arr[child]){
			arr[i]=arr[child];
		}
		else{
			//当前取出来的值终于大于两个儿子时。 
			break;
		}
		
	} 
	//上面轮完之后,肯定找到了一个儿子比我们取出来的值还要小的
	arr[i]=temp; 
} 
void heap_sort(int arr[],int n){
	int i;
	//建堆
	for(i=n/2;i>=0;i--){
		perc_down(arr,i,n);
	}
	//取最大值放在最后已经舍弃的位置上,下滤剩下的堆
	for(i=n-1;i>0;i--){
		//取最大值放在最后已经舍弃的位置上
		swap(&arr[0],&arr[i]);
		// 滤剩下的堆
		perc_down(arr,0,i);
	}
}
//归并排序
//第一步,写一个将两个已经排好序列的归并
void merge(int arr[],int temp_arr[],int left_start,int right_start
			,int right_end)
{
	int i,temp_start,elem_num,left_end;
	temp_start=left_start;
	left_end=right_start-1;
	elem_num=right_end-left_start+1;
	//归并的核心
	while(left_start<=left_end&&right_start<=right_end){
		if(arr[left_start]<=arr[right_start]){
			temp_arr[temp_start++]=arr[left_start++];
		}
		else{
			temp_arr[temp_start++]=arr[right_start++];
		}
	}	
	while(left_start<=left_end){
		temp_arr[temp_start++]=arr[left_start++];
	}		
	while(right_start<=right_end){
		temp_arr[temp_start++]=arr[right_start++];
	}
	//重新拷回去,记住,这里归并的只是原来数组的一部分,所以不能从头开始
	for(i=0;i<elem_num;i++,right_end--) {
		arr[right_end]=temp_arr[right_end];
	}
} 
//第二步,递归调用归并,将数组不断分割
void m_sort(int arr[],int temp_arr[],int left,int right){
	//tra_arr(arr,10);
	int center;
	//递归结束条件
	if(left<right){
		center=(right+left)/2;
		m_sort(arr,temp_arr,left,center);
		m_sort(arr,temp_arr,center+1,right);
		merge(arr,temp_arr,left,center+1,right);
	} 
} 
//第三步,初始化临时数组
void merge_sort(int arr[],int n){
	int *temp_arr;
	temp_arr=(int*)malloc(n*sizeof(int));
	m_sort(arr,temp_arr,0,n-1);
	free(temp_arr);
} 

//快速排序
//首先,实现三数中值分割法,取一个“裁判” (中值) 
int get_pri(int arr[],int left,int right){
	int center=(left+right)/2;
	if(arr[left]>arr[center]){
		swap(&arr[left],&arr[center]);
	}
	if(arr[left]>arr[right]){
		swap(&arr[left],&arr[right]);
	}
	if(arr[center]>arr[right]){
		swap(&arr[center],&arr[right]);
	}
	//把中值扔到倒数第二个,因为上述操作已经让倒数第一大于中值了 
		swap(&arr[center],&arr[right-1]);
		
	return arr[right-1];
	
} 
//其次,实现分而治之
void q_sort(int arr[],int left,int right){
	int i,j,pri;
	//如果规模已经小于三了,就不要再分而治之了,没得分了 
	if(right-left>=3){
		//取中值
		pri= get_pri(arr,left,right);
		//取左右往中间靠拢的两个指针i,j
		i=left;
		j=right-1;
		//开始判断
		while(1){
			//如果当前i对应的值小于裁判,继续推进 
			while(arr[++i]<pri);
			// 如果当前i对应的值大于裁判,继续推进
			while(arr[--j]>pri);
			//上面走完,肯定碰到硬杈了,在i和j没有错位的情况下
			//交换
			if(i<j){
				swap(&arr[i],&arr[j]);
			} 
			else{
				break;
			}
		} 
		swap(&arr[i],&arr[right-1]);
		//这个i的作用远不止此,这个i还记录了上一个裁判的位置
		//开始对分下来的两个部分进行同样的操作
		q_sort(arr,left,i-1);
		q_sort(arr,i+1,right); 
	}
	//如果递归到规模已经无法再分了
	//就用普通的方法排序
	else{
		 
		insert_sort(arr+left,right-left+1);
	}
	
} 
//最后包装一下
void quick_sort(int arr[],int n){
	q_sort(arr,0,n-1);
} 
//遍历数组
void tra_arr(int arr[],int n){
	for(int i=0;i<n;i++){
		printf("%d  ",arr[i]);
	}
	printf("\n");
} 

以上就是C语言所有经典排序方法的实现代码的详细内容,更多关于C语言排序方法的的资料请关注编程网其它相关文章!

--结束END--

本文标题: C语言所有经典排序方法的实现代码

本文链接: https://www.lsjlt.com/news/127388.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言所有经典排序方法的实现代码
    运行结果正确 还是快速排序难一些。 完整代码 #include<stdio.h> #include <stdlib.h> #include <st...
    99+
    2024-04-02
  • C语言实现经典排序算法的示例代码
    目录一、冒泡排序1.原理2.实现3.算法分析二、选择排序1.原理2.实现3.算法分析三、插入排序1.原理2.实现3.算法分析四、希尔排序1.原理2.实现3.算法分析总结一、冒泡排序 ...
    99+
    2022-11-13
    C语言排序算法 C语言排序
  • C语言的经典程序有哪些
    本篇内容介绍了“C语言的经典程序有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、C语言必背18个经典程序第一个------乘法表。用...
    99+
    2023-07-02
  • C语言堆排序经典算法TopK问题解析
    目录问题描述:快速排序TopK问题描述: 从arr[1, n]这n个数中,找出最大的k个数,这就是经典的TopK问题 什么是TopK,就是找到一个无序队列中的k个最大数。 TopK...
    99+
    2023-05-15
    C语言堆排序TopK算法 TopK算法问题
  • C语言实现经典windows游戏扫雷的示例代码
    目录1. 前言2. 准备工作3. 设计思路4. 定义数组5. 初始化6. 打印7. 布置雷8. 排查雷9. 完整代码game.hgame.ctest.c1. 前言 大家好,我是努力学...
    99+
    2022-11-13
    C语言扫雷游戏 C语言 扫雷 C语言 游戏
  • C语言实现经典扫雷小游戏的示例代码
    目录一、游戏简介二、游戏实现1.初始化棋盘2.打印棋盘3.布置雷4.排查雷三、源文件1.game.h2.game.c3.Test.c一、游戏简介 游戏初始界面有两个选择,选项&ldq...
    99+
    2022-11-13
    C语言扫雷游戏 C语言 扫雷 C语言 游戏
  • C语言非数值计算的常用经典排序算法有哪些
    这篇文章主要讲解了“C语言非数值计算的常用经典排序算法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言非数值计算的常用经典排序算法有哪些”吧!排序...
    99+
    2024-04-02
  • C语言数据结构经典10大排序算法实例分析
    今天小编给大家分享一下C语言数据结构经典10大排序算法实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、冒泡排序//...
    99+
    2023-06-29
  • C语言实现经典小游戏井字棋的示例代码
    目录前言一、井字棋游戏的主流程二、游戏部分1.游戏函数2.初始化棋盘3.打印棋盘4.玩家下棋5.电脑下棋(两个难度等级)6.判断游戏是否结束三、 运行展示四、源码展示前言 这是我在学...
    99+
    2022-11-13
    C语言井字棋游戏 C语言 井字棋 C语言 游戏
  • C语言实现冒泡排序算法代码怎么写
    这篇文章主要介绍“C语言实现冒泡排序算法代码怎么写”,在日常操作中,相信很多人在C语言实现冒泡排序算法代码怎么写问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言实现冒泡排序算法代码怎么写”的疑惑有所帮助!...
    99+
    2023-06-29
  • C语言堆排序经典算法TopK问题怎么解决
    本文小编为大家详细介绍“C语言堆排序经典算法TopK问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言堆排序经典算法TopK问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。问题描述:从a...
    99+
    2023-07-05
  • C语言数据结构经典10大排序算法刨析
    1、冒泡排序 // 冒泡排序 #include <stdlib.h> #include <stdio.h> // 采用两层循环实现的方法。 // 参数a...
    99+
    2024-04-02
  • C语言实现交换排序算法(冒泡,快速排序)的示例代码
    目录前言一、冒泡排序1.基本思想2.优化3.扩展二、快速排序1.基本思想2.优化3.代码前言 查找和排序是数据结构与算法中不可或缺的一环,是前辈们在算法道路上留下的重要且方便的一些技...
    99+
    2024-04-02
  • C语言实现可排序通讯录的示例代码
    目录1.目的2.分部流程1.初始化通讯录2.添加联系人3.判断联系人是否存在4.判断通讯录是否已满5.判断通讯录是否为空6.通讯录扩容7.核心函数8.查找联系人9.修改联系人10.清...
    99+
    2024-04-02
  • C语言 八大排序算法的过程图解及实现代码
    目录前言一、插入排序时间复杂度空间复杂度代码实现(升序)二、希尔排序时间复杂度空间复杂度代码实现三、选择排序时间复杂度空间复杂度代码实现四、堆排序时间复杂度空间复杂度代码实现五、冒泡...
    99+
    2024-04-02
  • c语言中有哪些排序的方法
    这期内容当中小编将会给大家带来有关c语言中有哪些排序的方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、选择排序-简单选择排序选择排序是最简单的一种基于O(n2)时间复杂度的排序算法,基本思想是从i=...
    99+
    2023-06-20
  • C语言冒泡排序算法代码详解
    今天我们来用C语言实现一下冒泡排序 首先我们来了解一下什么叫做冒泡排序,冒泡顾名思义把质量轻的气体(如二氧化碳一样)浮到水面上(如可乐中的二氧化碳),因此冒泡排序的原理就是N个元素在...
    99+
    2024-04-02
  • Go语言实现常用排序算法的示例代码
    目录冒泡排序快速排序选择排序插入排序排序算法是在生活中随处可见,也是算法基础,因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题,可以说是每个程序员都必须得...
    99+
    2024-04-02
  • Go语言代码转C语言的实现方法详解
    随着计算机科技的快速发展,编程语言也在不断涌现。其中,Go语言因其简洁、高效和并发性能而备受关注。然而,在某些特定的场景下,我们可能需要将Go语言代码转换为C语言,以提高性能或兼容性。...
    99+
    2024-03-07
    代码实现 转换方法 go到c go语言
  • Java十大经典排序算法的实现图解
    目录前言一、排序算法1.排序算法概述(百度百科)2.《数据结构与算法》中的排序算法3.算法分析二、十大经典排序算法(Java开发版)1.冒泡排序2.快速排序3.基数排序4.插入排序5...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作