【排序】选择排序与冒泡排序

3.选择排序

思路:每一次找出最小和最大的数,分别放在左边和右边

void selectsort(int *a, int size)
{
    int begin = 0;
    int end = size - 1;
    while (begin < end)
    {
        int max = begin;
        int min = begin;
        for (int i = begin + 1; i <= end; i++)
        {
            if (a[i] < a[min])//找出最小值的下标
            {
                min = i;
            }
            if (a[i] > a[max])//找出最大值的下标
            {
                max = i;
            }
        }

        Swap(&a[begin], &a[min]);//最小值放到左边
        if (begin == max)//如果最大值的下标为begin,由于上一步的Swap,最大值去到了下表为min的位置
        {
            max = min;
        }
        Swap(&a[end], &a[max]);//最小值放到右边
        begin++;
        end--;
    }
}

例如对9,8,7,6,5,4,3,2,1进行选择排序
第一趟排序:1,8,7,6,5,4,3,2,9
第二趟排序:1,2,7,6,5,4,3,8,9
以此类推。。。。
下面对第一趟排序进行解释:
1:一开始max和min的下标均为数组头;经过一次for循环后,max的下标为0,min的下标为8;
2:接着把min下标对应的数放置begin下标的位置,此时数组为
1,8,7,6,5,4,3,2,9。(注意此时由于max的下标就在begin的位置,由于数值交换导致max对应的值放到了下标为min的位置,所以我们要添加一个判断:如果begin就是最大值的下标,那么由于上一步最小值的交换,所以此时最大值去到了下标为min的位置,因此把max的下标更正)
3:接着交换max位置与end位置的值
4:此时就为 :1,8,7,6,5,4,3,2,9
5:缩小排序范围,begin++,end–;
6:进行第二趟排序。。。。。。。。
选择排序的时间复杂度:O(N^2)
(在任何情况下都O(N^2))

4.冒泡排序

void bubblesort(int *a, int size)
{
    int exchange = 0;
    for (int j = 0; j < size; j++)//一共走size 躺,(size为数组的元素个数)
    {
        for (int i = 1; i < size - j; i++)//每一趟前后两个数比较,把大的数往后放
        {
            if (a[i - 1] > a[i])
            {
                exchange = 1;//用于判断原来的数组是否已经有序
                Swap(&a[i - 1], &a[i]);
            }
        }
        if (exchange == 0)//原来的的数组就已经有序
        {
            break;
        }
    }
}

例如 9,8,7,6,5,4,3,2,1
每一趟排序通过前后两个数之间的比较,把最大的数排到最后面。以此类推。。。
其中exchange是用来判断未排序前数组是否已近有序。
在这里插入图片描述

时间复杂度:O(N^2)
最好的情况:O(N)

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值