C++实现选择排序算法(个人理解编写)

简单选择排序又称为直接选择排序,是选择排序中最简单的一种方法。选择排序算法的基本思想是:每次从待排无序记录序列中选出关键字最小的记录插入至已排好序的记录序列的后面,直到n个记录全部插入已排好序的记录序列中。常用的两种选择排序方法是简单选择排序和堆排序。

简单选择排序算法的操作步骤如下。

(1)第一次操作时,整个待排序列是无序的,从待排记录序列中找出关键字最小的记录,并将其与下标为1的记录交换位置。

(2)在第i次操作时,1≤i≤n-1,下标为1、2、…、i-1的记录已经为有序序列,在下标为从i至n的无序记录中找出关键字最小的记录,与下标为i的记录交换位置。

(3)不断重复步骤(2),每次重复都会从剩余待排记录序列中选出关键字最小的记录排在已经排好序的有序记录序列的最后一个记录之后。经过n-1次的选择和多次交换后,R[1]~R[n]就排成了有序序列,整个排序过程结束。具有n个记录的待排记录序列要做n-1次的选择和交换才能成为有序表。

源代码:

#include <iostream>
#include <cstdlib>  //rand() 和 srand()的头文件
#include <ctime> //time的头文件
#define MAXSIZE 10 //宏定义数组最大容量
using namespace std;

void make_sorted(int * array) //随机生成100以内的乱序整数
{ //这里把array[0]留着当中转站用
    srand((unsigned int)time(NULL));
    cout << "随机生成的10个数为:";
    for(int i = 1; i < MAXSIZE + 1; i++)
    {
        array[i] = rand() % 100;
        cout << array[i] << " ";
    }
    cout << endl;
}

void select_sort(int * array) //选择排序
{
    int mark; //mark标记选出来的最小值的位置
    for (int i = 1; i < MAXSIZE; i++) //最外循环:排序总共需要排9次
    {
        array[0] = array[i]; //a[i]赋值给a[0]
        for (int j = i; j < MAXSIZE + 1; j++) //一开始需要从10个数里面挑选,然后逐次减少
        {
            if (array[0] > array[j]) //用来挑选最小值
            {
                array[0] = array[j]; //用小的那个值替代a[o]里面的值
                mark = j; //标记好最小值原本的位置
            }
        }

        for (int k = mark - i; k > 0; k--) //最小值往前需要移mark - i 次
        {
            array[mark] = array[mark-1]; //前面的数往后移
            mark--; 
        }

        array[i] = array[0]; //全部移完之后,a[0]里面的值位置就有了(a[0]是第i小的值)
    }

    cout << "选择排序的结果为:";
    for (int i = 1; i < MAXSIZE + 1; i++)
    {
        cout << array[i] << " ";
    }
    cout << endl;
}

int main()
{
    int * array;
    array = new int [MAXSIZE];

    make_sorted(array);
    select_sort(array);
    cout << endl;
    
    delete [] array;
    return 0;
}

演示结果截图:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值