冒泡排序和选择排序
用了c++之后再回到c语言写排序好陌生(垂头)
记得大一的时候总是搞不清楚这两个排序,现在回过头来看发现还是要根据图来理解,而不是找代码的特征来记(扇耳刮子)
冒泡排序:
可以看到第一个数组肯定是从0开始作比较的,并且比较到最后一次由于已经固定一个最大值,所以最后一次就没必要比较了,所以循环上限要减去1;
随着最大值一个一个的被固定,所以二次循环的比较次数应该是越来越少的,大循环执行一次就固定一个最大值所以二次循环的范围上限要在外部循环范围上限的基础上再减去i
int n;
scanf("%d",&n);
int a[n];
for(int i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
int temp;
for(int i = 0; i < n-1; i++)
{
for(int j = 0; j < n-i-1; j++)
{
if(a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
//接下来再做一个输出就好啦
我觉得冒泡排序稍微的难点也就是对循环变量的理解了,所以只要循环变量的范围理解了那么冒泡排序就拿下了
选择排序
(红色代表min)
可以看到选择排序不同于冒泡排序的地方就是相对来说规律了一点,没有那么的散漫,开始按照常规的套路出牌了,是我们一下子就能想到的排序思路~
思路就是先从第一个数起,跟后边的数依次比较,比较出来一个最小值跟第一个数进行交换
外部循环要做的事情就是设置一个假的最小值并在内部循环找出来真的最小值之后将假的最小值打回原形,也就是做一个交换
选择排序的难点应该就是在其中是通过引用下标来让数字进行比较,而不是直接的用数字进行比较,因为既然有“人”冒充最小值我们就要记得他的位置,好追过去让他给我们让位嘛,至于他去哪,就去正主的位置呗
所以在比较之后我们对当前一轮循环中的最小值的保存是保存的下标,在最开始设立最小值时设立的也是第一个数字的下标(假设每一次开始的数值都是最小值)
int n;
scanf("%d",&n);
int a[n];
for(int i = 0; i < n; i++){
scanf("%d",&a[i]);
}
//上面这一段初始化的语句你们有没有写烦啊啊啊
int min;
int temp;
for(int i = 0; i < n-1; i++)
{
min = i;
for(int j = i+1; j < n; j++)
{
if(a[min] > a[j])//小中自有小中手
min = j;
}
temp = a[i];
a[i] = a[min];
a[min] = temp;
}
//下面再输出就好啦
以上两个排序都是从小到大的,如果想从大到小就在内层循环的判断条件里把 <
改成 >
就好啦