美文网首页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++中级算法第一天(选择排序)

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