c语言中冒泡和选择排序

一.选择排序

      很多学习C语言的同学都被这两种排序而难倒。每次拿到这样一组数字就不知道从何下手了,要不就是那些运用的不太熟悉,每次写起代码来又得花一大半时间让费在这排序上,总是找不到一种好的办法去学习它。那么接下来,我将我所学到的排序方法分享给大家,告诉你们以后遇到这种排序千万不能急。当然,很多企业面试的时候种排序也是必考的,所以我们务必要把他们搞懂,不能让这么小小的排序阻挡了我们前进的步伐。好了,那我们来看看吧!

      我选择的方法是函数调用的方法,将排序的具体方式通过函数调用到main函数中执行,具体的实现我们来看看代码吧。

    

//自定义一个选择排序的函数
void xuanZePaiXu(int arr[],int len){
	//定义一个最大的角标
	int tempindermax = 0;
	//用for循环控制外层的趟数
	for(int i = 0;i<len-1;i++){
		//最大角标和i的关系
		tempindermax = i;
		//内部循环用for来控制
		for(int j = i+1;j<len;j++){
			//交换最大角标的值
			if(arr[tempindermax]<arr[j]){
				tempindermax = j;
			}
		}
		  

  通过上面的代码,我们可以看出,选择排序的思想是for循环,for循环是里面的主体部分,因为外层的循环起到对循环趟数的限制。而内部的for循环,首先确定是否要交换最大值的角标,如果不用交换,就直接去交换两个数的值。这里采用的交换两个数的值的方法是定义第三方变量,通过他们之间的数值交换,从而达到两个数的交换。而代码就是下面这部分。

      

printf("外层第%d次循环,角标的最大值是%d\n",i,tempindermax);
		//交换两个数的值
		int temp = arr[i];
		arr[i] = arr[tempindermax];
		arr[tempindermax] = temp;
		//遍历数组每一个元素
		for(int k = 0;k<len;k++){
			printf("%d ",arr[k]);
		}
		printf("\n");
	}
	return;
}           

  当然中间插入一个printf函数是为了打印出来的结果更容易读懂而已。上面那部分是自己定义在函数中的部分,里面还有一些是未知的,比如:数组长度,数组的值,都是不知道的,那么这些都是在main函数里面计算得到的,下面我们来看看数组的长度和数组的定义是怎么做的。

      

#include <stdio.h>
//自定义选择排序函数的声明
void xuanZePaiXu(int arr[],int len);
int main(){
	//定义一个数组
	int arr[] = {3,5,8,1,9,4,7};
	//用sizeof计算定义的数组的长度
	int len = sizeof(arr)/sizeof(int);
	//调用函数
	xuanZePaiXu(arr,len);
	return 0;
}

  数组的长度,我这里主要是运用sizeof计算整个数组的字节数,然后再用字节数除以数组的总元素,这样就能得出数组的长度了。然后千万不要忘了写函数的声明,你不写是不可能实现的。接下来就是函数的调用了。整体的代码就是这样了,希望你能学懂选择排序,也希望我的方法能对你管用。

二.冒泡排序

      在介绍冒泡排序方法之前我要说一下,冒泡排序方法比较消耗内存,因为它的运作方式是每一次都得两两比较,然后再判断是否要交换值。相比选择排序,冒泡排序还是有它的微弱之处,所以在开发过程中到底用哪个,你们自己看着办吧。那我现在具体介绍下冒泡吧,首先我们来看看一部分代码。

      

//定义一个函数
void maoPaoPaiXu(int arr[],int len){
	//定义一个变量
	int temp;
	//外层for循环控制趟数
	for(int i = 0;i<len-1;i++){
		//内部for循环控制趟数里面的轮数
		for(int j = 0;j<len-1-i;j++){
			//值的交换
			if(arr[j]<arr[j+1]){
				temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			}
		}

  通过代码不难看出,也是和选择一样,for循环是主体部分,然后就是if语句判断是否要有值的交换,当然里面交换值的方法还是用第三方变量,在开发过程中我也建议大家用第三方变量来交换两个数的值,因为直观嘛好理解。外层循环总趟数一定不会超过len-1的。而内部的循环,因为每次进行完一趟之后就有一个数确定了,所以就是len-i-1次了。

      

//遍历并打印出排序后的结果
		for(int k = 0;k<len;k++){
			printf("%d ",arr[k]);
		}
		printf("\n");
	}
	return;
}

  然后就是遍历数组了,这是一个简单的for循环,就能直接的把排好的数组中的每一个元素打印出来。由于希望打印出来的结果好看点,就在每一趟排序完就打印一行了所以看起来要直观点。下面我就将两种方法实现的结果放在最后面了。下图第一张是选择排序实现的结果,而第二张则是冒泡排序实现的结果。

三.结束语

       不管你选择哪种办法,或许你会有更好的,但是我在这里只是把我自己认为是好的分享给你们,希望能帮到你们。让我们一起进步吧,一起在C语言的世界里徜徉,不分你我、他!!!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值