C++数组应用-排序算法

 一.冒泡排序

1.1,泡沫排序可以形象的理解为:较小的值像气泡一样逐渐的上浮到数组的顶部,或者较大的值逐渐下沉到数组底部。这种排序技术需要逐渐排序好几轮,每一轮都要比较连续的数组元素对。按要求交换它们的值。

1.2,冒泡排序法比较易于实现,但是不论情况好坏,都要进行所有轮的比较,运行速度较慢。

#include <iostream>
using namespace std;

// 冒泡排序法
void bubble(int a[], int size);
int main()
{
    int array[] = {55, 2, 7, 89, 100, 6, 11, 14, 67};
    int len = sizeof(array) / sizeof(int); // 计算元素个数
    for (int i = 0; i < len; i++)          // 元素顺序输出
    {
        cout << array[i] << ",";
    }
    cout << "\n\n";
    bubble(array, len);
    system("pause");
    return 0;
}

void bubble(int a[], int size)
{
    for (int pass = 1; pass < size; pass++)
    { // 共比较size-1轮
        for (int i = 0; i < size - pass; i++)
        { // 比较一轮
            if (a[i] > a[i + 1])
            {
                int temp = a[i]; // 交换元素
                a[i] = a[i + 1];
                a[i + 1] = temp;
            }
        }
        for (int i = 0; i < size; i++)
        { // 比较一轮后输出
            cout << a[i] << ",";
        }
        cout << endl;
    }
}


二.插入排序

2.1,插入排序通过把数组中的元素插入到适当的位置来进行排序。

        首先:(1)将数组中的前两个元素按顺序排序,(2)把下一个元素(第3个)插入到其对应于已排序元素的排序位置,(3)对于数组中的每个元素重复步骤(2)

2.2,所谓插入过程,就是待插元素与左边元素不断比较及挪移的过程。若小于,则左边元素挪移到右边,若不小于,则将待插元素安顿在右边而结束。

2.3,排序函数isort()中的inserter是待插入元素,index是当前准备与插入元素比较的元素下标。

挪位是赋值操作,不是交换操作,所以工作量减轻很多。但是插入排序的每轮比较都是不可缺少的,无法进一步优化算法。

#include <iostream>
using namespace std;

// 插入排序
void isort(int a[], int size);
int main()
{
    int array[] = {55, 2, 7, 89, 100, 6, 11, 14, 67};
    int len = sizeof(array) / sizeof(int); // 计算元素个数
    for (int i = 0; i < len; i++)          // 元素顺序输出
    {
        cout << array[i] << ",";
    }
    cout << "\n\n";
    isort(array, len); // 调用排序函数
    system("pause");
    return 0;
}

void isort(int a[], int size) // 插入排序
{
    for (int i = 1; i < size; i++) // 共执行size-1轮
    {
        int ins = a[i], idx = i - 1;
        for (; idx >= 0 && ins < a[idx]; idx--)
        {
            a[idx + 1] = a[idx]; // 后挪一个位置
        }
        a[idx + 1] = ins;              // 插入
        for (int j = 0; j < size; j++) // 比较一轮后输出
        {
            cout << a[j] << ((j == i) ? "|" : ","); // ‘|’为已排未排分界线
        }
        cout << endl;
    }
}

三.快速排序

3.1,快速排序法被认为是效率较高的排序算法

3.2,快速排序是建立在把数组分为许多部分的思想上。

#include <iostream>
using namespace std;

// 快速排序
void qsort(int a[], int left, int right);
int main()
{

    int array[] = {55, 2, 7, 89, 100, 6, 11, 14, 67};
    int len = sizeof(array) / sizeof(int);
    for (int i = 0; i < len; i++)
    { // 原始顺序输出
        cout << array[i] << ",";
    }
    cout << "\n";
    qsort(array, 0, len - 1);

    for (int i = 0; i < len; i++)
    {
        cout << array[i] << ","; // 排序结果输出
    }
    cout << endl;
    system("pause");
    return 0;
}

void qsort(int a[], int left, int right)
{
    int pivot = a[right], l = left, r = right, temp;
    while (l < r)
    {
        temp = a[l], a[l] = a[r], a[r] = temp; // 交换
        while (l < r && a[r] > pivot)
            --r;
        while (l < r && a[l] <= pivot)
            ++l;
    }
    temp = a[left], a[left] = a[r], a[r] = temp; // 使a[r]成为分界元
    if (left < r - 1)
        qsort(a, left, r - 1);
    if (r + 1 < right)
        qsort(a, r + 1, right);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值