选择排序法-Selection Sort

一、O(n2)的排序算法
(1)基础
(2)编码简单,易于实现,是一些简单情景的首选
(3)在一些特殊情况下,简单的排序算法更有效
(4)简单的排序算法思想衍生出复杂的排序算法
(5)作为子过程,改进更复杂的排序算法
二、选择排序-Selection Sort
(1)对下面数组从小到大排序
在这里插入图片描述
(2)找到数组中最小的元素1和第一个位置8进行交换,此时1这个元素就已经在最终数组排好序的位置了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述(3)此时,找数组中第二小的元素为2,和当前数组第一个没有排序的位置的元素6进行交换,此时元素2也已经归位,以此类推
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【代码】
<selection_sort.cpp>

#include <iostream>
#include <algorithm>
#include <string>
#include "Student.h"
#include "SortTestHelper.h"
using namespace std;
//选择排序核心代码
template <typename T>
void selectionSort(T arr[], int n) {
    for(int i = 0; i < n; i++) {
        //寻找[i,n)区间里的最小值
        int minIndex = i;
        for(int j = i + 1; j < n; j++) {
            if(arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        swap(arr[i], arr[minIndex]);
    }
}

int main() {
	//对整型数组进行排序
    int a[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    selectionSort(a, 10);
    for(int i = 0; i < 10; i++) {
        cout << a[i] << " ";
    }
    cout << endl;
    //对浮点型数组进行排序
    float b[4] = {4.4, 3.3, 2.2, 1.1};
    selectionSort(b, 4);
    for(int i = 0; i < 4; i++) {
        cout << b[i] << " ";
    }
    cout << endl;
    //对字符串数组进行排序
    string c[4] = {"D", "C", "B", "A"};
    selectionSort(c, 4);
    for(int i = 0; i < 4; i++) {
        cout << c[i] << " ";
    }
    cout << endl;
    //对自定义类型数组进行排序
    Student d[4] = {{"D", 90}, {"B", 95}, {"A", 95}, {"C", 100}};
    selectionSort(d, 4);
    for(int i = 0; i < 4; i++) {
        cout << d[i];
    }
    cout << endl;
    //用辅助函数进行测试
    int n = 10000;
    int *arr = SortTestHelper::generateRandomArray(n, 0, n);
	sortAlgorithm(arr, n);
    SortTestHelper::printArray(arr, n);
    delete[] arr;
    //测试算法的性能及正确性
    SortTestHelper::testSort("Selection Sort", selectionSort, arr, n);
    delete[] arr;
    return 0;
}

<Student.h>

#ifndef SELECTIONSORT_STUDENT_H
#define SELECTIONSORT_STUDENT_H
#include <iostream>
#include <string>
using namespace std;
struct Student {
    string name;
    int score;
    //重载运算符<
    bool operator<(const Student &otherStudent) {
    	//如果分数相同,按照姓名的字典序排序
        return score != otherStudent.score ? score < otherStudent.score : name < otherStudent.name;
    }
    //定义一个友元函数,重载<<运算符
    friend  ostream& operator<<(ostream &os, const Student& student) {
        os << "Student:" << student.name << " " << student.score << endl;
        return os;
    }
};
#endif //SELECTIONSORT_STUDENT_H

<SortTestHelper.h>

#ifndef SELECTIONSORT_SORTTESTHELPER_H
#define SELECTIONSORT_SORTTESTHELPER_H
#include <iostream>
#include <ctime>
#include <cassert>
using namespace std;
//将辅助测试的函数放入新的命名空间SortTestHelper中
namespace SortTestHelper {
	//生成有n个元素的随机数组,每个元素的随机范围为[rangeL,rangeR]
    int* generateRandomArray(int n, int rangeL, int rangeR) {
        assert(rangeL <= rangeR);
        int *arr = new int[n];
        //把时间当作种子作为随机数的设置
        srand(time(NULL));
        for(int i = 0; i < n; i++) {
            arr[i] = rand() % (rangeR - rangeL + 1) + rangeL;
        }
        return arr;
    }
    //打印排好序的数组
    template <typename T>
    void printArray(T arr[], int n) {
        for(int i = 0; i < n; i++) {
            cout << arr[i] << " ";
        }
        cout << endl;
        return;
    }
    //判断数组是否排序成功的
    template <typename T>
    bool isSorted(T arr[], int n) {
        for(int i = 0; i < n - 1; i++) {
            if(arr[i] > arr[i + 1])
                return false;
        }
        return true;
    }
    //模版函数,测试排序效率及正确性
    template <typename T>
	//排序算法名称、函数的指针、测试数组、数组元素个数
    void testSort(string sortName, void(*sort)(T[], int), T arr[], int n) {
    	//返回时钟周期
        clock_t startTime = clock();
        sort(arr, n);
        clock_t endTime = clock();
        //如果排序结果有误,程序将在此终止
        assert(isSorted(arr, n));
        //CLOCKS_PER_SEC---宏,表示每秒钟运行的时钟周期的个数
        cout << sortName << " : " << double(endTime - startTime) / CLOCKS_PER_SEC << " s" << endl;
        return;
    }
#endif //SELECTIONSORT_SORTTESTHELPER_H
发布了29 篇原创文章 · 获赞 11 · 访问量 3955

猜你喜欢

转载自blog.csdn.net/weixin_41462017/article/details/104683009
今日推荐