美文网首页C语言C++部落数据结构和算法分析
C++中级算法第一天(选择排序)

C++中级算法第一天(选择排序)

作者: 权的小树洞 | 来源:发表于2019-03-14 19:41 被阅读90次

今天开始就写中级算法了,哈哈哈



这个星期小编主要围绕着排序问题来写算法

一共会写8个关于排序的算法

1.选择排序
2.插入排序
3.冒泡排序
4.快速排序
5.希尔排序
6.归并排序
7.基数排序
8.堆排序
就是以上列出的着八个算法,大概就是每天一个算法,8天就能讲完了


所以今天小编要讲的算法就是选择排序了,在讲选择排序之前,小编先给不懂的同学科普一下,到底什么是选择排序?
选择排序法 是对 定位比较交换法(也就是冒泡排序法) 的一种改进。选择排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。

简单选择排序的基本思想:第1趟,在待排序记录r[1]r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。

思路如下:

我们不断的去遍历数据,从交换过的数据的下一个位置开始遍历,先把下一个位置的数据记录下来,然后遍历后来的数据,如果发现更小的数据,就记录下来,直到遍历完后,我们再将最小的数据和开始记录的那个数据交换。
当我们遍历完所有的数据后,我们的数据就排好了
首先我们实现将第几趟的所有数据打印出来的功能:

void print(int a[], int n, int i)
{
//a[]数组为我们排序的数据,n是我们数据的长度,i代表了趟数,至于为什么是i+1后面就有解释
    cout << "第" << i + 1 << "趟:";
    for (int j = 0; j < n; j++)
    {
        cout << a[j] << ",";
    }
    cout << endl;
}

至此,我们就实现了打印数据的功能,接下来就是如何排序
排序我们拆成两个函数:
1.选择最小数据的函数SelectMinKey()
2.交换排序的函数selectSort()
先来实现选择最小的函数

分析:

需要遍历未排完序的数组
返回最小的数据的位置Key

int SelectMinKey(int a[], int n, int i)
{
    int k = i;
    for (int j = i + 1; j < n; ++j)
    {
        if (a[k] > a[j])
            k = j;
    }
    return k;
}

在我们的参数列表,第一个表示了数据数组,n代表了需要的遍历的数据最大的长度,i表示了已经排完序的数据数量,然后我们从排完序的数据后一位开始遍历,寻找更小的数据,使用if判断,如果判断成立,有更加小的数字,我们就将数据进行记录,然后继续遍历选择,有没有比这个数据更加小的数据,最后将最小的数据返回
然后下一个函数就是要实现交换的

分析:

1.需要跑遍数据,排序完成需要的次数应该是数据的长度
2.实现数据的交换功能

void selectSort(int a[], int n)
{
    int key, tmp;
    for (int i = 0; i < n; ++i)
    {
        key = SelectMinKey(a, n, i);
        if (key != i)
        {
            tmp = a[i];
            a[i] = a[key];
            a[key] = tmp;
        }
        print(a, n, i);
    }

这个函数的参数,第一个是我们的数据数组,第二个为长度
再看函数体,函数顶部定义了两个数据,一个用来存储返回最小的数据的位置Key,另一个用于存储交换的数据tmp
我们使用SelectMinKey()函数,返回了最小数据的位置,然后判断,如果这个位置不是原本的循环开始的时候i的位置,那我们就可以认为,函数程序找到了更加小的数据,而且我们已经知道了更小数据的位置,所以我们去交换这两个数据就做到了排序,这样的一次循环,我们称之为一趟排序,因为我们每次排序都是只排好了一个数据,所以需要排数组的长度次。

#include <iostream>

using namespace std;

void print(int a[], int n, int i)
{
    cout << "第" << i + 1 << "趟:";
    for (int j = 0; j < n; j++)
    {
        cout << a[j] << ",";
    }
    cout << endl;
}

int SelectMinKey(int a[], int n, int i)
{
    int k = i;
    for (int j = i + 1; j < n; ++j)
    {
        if (a[k] > a[j])
            k = j;
    }
    return k;
}

void selectSort(int a[], int n)
{
    int key, tmp;
    for (int i = 0; i < n; ++i)
    {
        key = SelectMinKey(a, n, i);
        if (key != i)
        {
            tmp = a[i];
            a[i] = a[key];
            a[key] = tmp;
        }
        print(a, n, i);
    }
}

int main()

{
    int a[8] = { 3,1,5,7,2,4,9,6 };
    cout << "初始值";
    for (int j = 0; j < 8; j++)
    {
        cout << a[j] << ",";
    }
    cout << endl;
    selectSort(a, 8);
    print(a, 8, 8);
}

以上就是选择排序算法的全部代码,还有就是希望喜欢编程的同学能坚持的学习,学习之路漫长,小编与你们同行!
哈哈哈哈,今天的算法就到这里了,再见各位!

相关文章

  • 排序算法详细代码实现

    算法分类 算法时间复杂度 选择排序 插入排序 C++实现 Python实现 冒泡排序 Python实现 归并排序 ...

  • C++中级算法第一天(选择排序)

    今天开始就写中级算法了,哈哈哈 这个星期小编主要围绕着排序问题来写算法 一共会写8个关于排序的算法 1.选择排序2...

  • 关于不同排序算法的性能比较

    一个排序算法性能测试的c++实现,用于测试不同排序算法的耗时,代码如下: 比较直接排序与选择排序示例: 测试结果:

  • 各种排序算法实现

    C++实现各种排序算法。上张图。 自定义的swap函数。 冒泡排序 插入排序 希尔排序 选择排序 快速排序 归并排...

  • 七大排序算法之冒泡排序

    七大排序算法之冒泡排序 @(算法笔记)[排序算法, 冒泡排序, C++实现] 冒泡排序介绍 冒泡排序是七大排序算法...

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • C++ 排序算法

    C++排序算法 待续

  • 七大排序算法之快速排序

    七大排序算法之快速排序 @(算法笔记)[排序算法, 快速排序, C++实现] [TOC] 快速排序的介绍: 快速排...

  • 算法4:插入排序和选择排序算法的比较

    排序算法列表电梯: 选择排序算法:详见 《算法4》2.1 - 选择排序算法(Selection Sort), Py...

  • 排序算法

    十大经典排序算法Lua版八大排序算法C++/C#

网友评论

    本文标题:C++中级算法第一天(选择排序)

    本文链接:https://www.haomeiwen.com/subject/vxsqmqtx.html