一、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
来源:CSDN
作者:King && Coder
链接:https://blog.csdn.net/weixin_41462017/article/details/104683009