一.选择排序
很多学习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语言的世界里徜徉,不分你我、他!!!!!