冒泡排序和选择排序

冒泡排序和选择排序

用了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;
}
//下面再输出就好啦

以上两个排序都是从小到大的,如果想从大到小就在内层循环的判断条件里把 < 改成 > 就好啦

冒泡排序选择排序都是常见的排序算法,下面分别介绍一下它们的工作原理和实现。 冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的列表,比较相邻的两个元素并将它们按照大小顺序进行交换,直到整个列表排序完成。 冒泡排序的步骤如下: 1. 从第一个元素开始,比较相邻的两个元素。 2. 如果顺序不正确,则交换它们的位置。 3. 继续比较下一对相邻元素,直到比较完所有元素。 4. 如果还有任何交换操作发生,则重复前面的步骤。 以下是用 Python 实现冒泡排序的代码: ```python def bubble_sort(arr): n = len(arr) for i in range(n): # 每次遍历会将最大的元素冒泡到最后 for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr ``` 选择排序(Selection Sort)也是一种简单的排序算法,它每次从未排序的部分中选择最小的元素,并将其放置在已排序部分的末尾。 选择排序的步骤如下: 1. 找到未排序部分中的最小元素。 2. 将最小元素与未排序部分的第一个元素交换位置。 3. 将已排序部分的长度加1。 4. 重复上述步骤,直到整个列表排序完成。 以下是用 Python 实现选择排序的代码: ```python def selection_sort(arr): n = len(arr) for i in range(n): min_index = i # 找到未排序部分的最小元素 for j in range(i+1, n): if arr[j] < arr[min_index]: min_index = j # 将最小元素与未排序部分的第一个元素交换位置 arr[i], arr[min_index] = arr[min_index], arr[i] return arr ``` 希望对你有所帮助!如果还有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Every DAV inci

小辣鸡一枚,不求打赏啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值