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

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

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

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

一共会写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);
}

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

    原文作者:ja先生
    原文地址: https://www.jianshu.com/p/5848ee1491b1
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞