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