1、选择排序
【思想】
所谓选择排序,就是每次选择最小的与当前未排序序列的第一个位置元素交换。
1、找到 0 ~ n-1 的最小值和 0 位置的数交换,此时0位置的数就是小的;
2、接下来找到 1 ~ n-1 的最小值和 1 位置的数交换,此时 1 位置的数就是第二小的;
3、接下来找到 2 ~ n-1 的最小值和 2 位置的数交换,此时 2 位置的数就是第三小的;
…
按照这种方式,最后该序列就是有序的了。
【代码】
void selectionSort(int arr[], int size) { //选择排序
if (size < 2) return ;
for (int start = 0; start < size; start++) {
int minValInd = start;
for (int k = start + 1; k < size; k++) {
minValInd = arr[k] < arr[minValInd] ? k : minValInd;
}
swap(arr, start, minValInd);
}
}
2、冒泡排序
【思想】
所谓冒泡排序,就是比较相邻元素的大小,谁大谁往后放。(从小到大的顺序)
1、在0 ~ n-1 范围中,通过比较相邻元素大小,最后最大值被放到了n-1位置处;
2、在0 ~ n-2 范围中,通过比较相邻元素大小,最后次大值被放到了n-2位置处;
…
按照这种方式,最后该序列就是有序的了。
【代码】
void bubbleSort(int arr[], int size) {
if (size < 2)
return ;
for (int end = size - 1; end >= 0; end--) {
for (int second = 1; second <= end; second++) {
if (arr[second - 1] > arr[second])
swap(arr, second - 1, second);
}
}
}
3、插入排序
【思想】
所谓插入排序,就是将新的元素放到已经排好序的序列的适当位置。
1、使得0~0范围有序,该范围只有一个元素,所以是有序的;
2、使得0~1范围有序,新来的元素是1位置的数,比较该值与已经排好序的位置的值(即0位置的值)大小,如果新值比较小,则交换二者;
3、使得0~2范围有序,新来的元素是2位置的数,依次比较该值与已排好序的序列(即0位置和1位置的值),直到序列中的值比该值小为止;
…
按照这种方式,最后该序列就是有序的了。
【代码】
void insertSort(int arr[], int size) {
if (size < 2)
return ;
for (int end = 1; end < size; end++) {
//目前end位置处的这个元素就是新元素
for (int pre = end - 1; pre >= 0 && arr[pre] > arr[pre + 1]; pre--) {
swap(arr, pre, pre + 1);
}
}
}
4、使用对数器验证排序算法
/*************************************************************************
> File Name: 对数器验证排序算法.cpp
> Author: Maureen
> Mail: Maureen@qq.com
> Created Time: 一 4/18 21:03:15 2022
************************************************************************/
#include <iostream>
using namespace std;
//数组备份
int* copyArray(int arr[], int size) {
int *ans = new int[size];
for (int i = 0; i < size; i++) {
ans[i] = arr[i];
}
return ans;
}
//判断数组是否有序
bool isSorted(int arr[], int size) {
if (size < 2)
return true;
int max = arr[0];
for (int i = 1; i < size; i++) {
if (max > arr[i])
return false;
}
return true;
}
void swap(int arr[], int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
//0~n-1 找到最小值与0位置的数交换
//1~n-1 找到最小值与1位置的数交换
//...
void selectionSort(int arr[], int size) { //选择排序
if (size < 2) return ;
for (int start = 0; start < size; start++) {
int minValInd = start;
for (int k = start + 1; k < size; k++) {
minValInd = arr[k] < arr[minValInd] ? k : minValInd;
}
swap(arr, start, minValInd);
}
}
//0~n-1 中两两比较,最大值被放到n-1位置处
//0~n-2 中两两比较,次大值被放到n-2位置处
//0~n-3
void bubbleSort(int arr[], int size) {
if (size < 2)
return ;
for (int end = size - 1; end >= 0; end--) {
for (int second = 1; second <= end; second++) {
if (arr[second - 1] > arr[second])
swap(arr, second - 1, second);
}
}
}
//0~0 使其有序(只有一个元素已完成)
//0~1使其有序
//0~2使其有序
//0~n-1使其有序
void insertSort(int arr[], int size) {
if (size < 2)
return ;
for (int end = 1; end < size; end++) {
//目前end位置处的这个元素就是新元素
for (int pre = end - 1; pre >= 0 && arr[pre] > arr[pre + 1]; pre--) {
swap(arr, pre, pre + 1);
}
}
}
int main() {
int maxLen = 50;
int maxValue = 1000;
int testTime = 10000;
//生成随机数组
int len = rand() % maxLen;
int *arr = new int[len];
for (int i = 0; i < len; i++) {
arr[i] = (int)(rand() % maxValue);
}
for (int i = 0; i < testTime; i++) {
int *tmp = copyArray(arr, len);
//selectionSort(arr, len);
//bubbleSort(arr, len);
insertSort(arr, len);
if (!isSorted(arr, len)) {
for (int i = 0; i < len; i++) {
cout << tmp[i] << " ";
}
cout << endl;
cout << "SelectionSort is wrong!" << endl;
break;
}
}
return 0;
}