冒泡排序 快速排序

交换排序

交换排序一般对待排序数组中的元素两两比较,不满足条件则交换,直到排序完成。
典型的交换排序有:冒泡排序和快速排序

冒泡排序

在冒泡排序过程中,数组的尾部会渐渐有序,有序的数组尾部慢慢边长,我把渐渐有序部分称为有序子数组,其余部分称为无序子数组,便于理解。
冒泡排序每一次大循环都会筛选出无序子数组中最大(小)的值放入有序子数组中,当一次大循环判断后,无序子数组有序时,循环可以中断。可以让flag=1,在无序子数组已经有序时flag=0,排序完成,减少非最坏情况下比较次数。

在这里插入图片描述

冒泡排序代码

void BubbleSort(int A[], int n)
{
    int flag = 1;
    for (int i = n - 1; i >= 1 && flag == 1; i--)
    {
        flag = 0;
        for (int j = 0; j < i; j++)
        {
            if (A[j] > A[j + 1])
            {
                swap(A[j], A[j + 1]);
                flag = 1;
            }
        }
    }
}

int main()
{
    int A[] = {8, 7, 5, 6, 1, 3, 2, 9, 10, 234, 121, 4, 2324, 98};
    BubbleSort(A, 14);
    for (int i = 0; i < 14; i++)
        cout << A[i] << " ";
    return 0;
}

快速排序

快速排序使用分治法实现,大问题拆成小问题,只需要写好小问题的代码,再递归调用。
以从小到大说明:
我实现的快速排序使用数组末位表示P,最终实现目标为P左边<P值<P右边的。
快速排序动画演示,建议:倍速减慢+暂停观看
我代码和上面视频有点区别,但重点是实现:左边值<P<右边值

在这里插入图片描述

快速排序代码

void QuickSort(int A[], int low, int high)
{
    if (low < high)
    {
        int P = A[high];

        int left = low;
        int right = high;

        while (left < right)
        {
            while (left < right && A[left] <= P)
                left++;
            A[right] = A[left];
            while (left < right && A[right] >= P)
                right--;
            A[left] = A[right];
        }

        A[left] = P;

        QuickSort(A, low, left - 1);
        QuickSort(A, left + 1, high);
    }
}

int main()
{
    int A[] = {0, 1, 2, 3, 4, 5, 6, 8, -9, -1, -5, -2, -8};
    QuickSort(A, 0, 12);
    for (int i = 0; i < 13; i++)
        cout << A[i] << " ";
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值