十大排序算法 — — 代码总结
一、冒泡排序(Bubble Sort)
- 空间复杂度:O(1)O(1)O(1)
- 平均时间复杂度:O(n2)O(n^2)O(n2)
1. 算法解析
冒泡排序:通过相邻元素的比较和交换,将较大的元素逐渐 ”冒泡” 到数列的末尾,从而实现数列的排序。
例如一个数组有 n
个元素,那么一共需要进行 n - 1
次排序才能保证数组是有序的,每一次排序中,将每个相邻的元素进行比较大小,如果出现更小的值在后面,则进行交换。
优化冒牌排序:设定一个标志 flag = false
,如果某一次排序中,没有进行一次交换,说明此时数组已是有序的,设置 flag = true
,提前结束排序。
2. 核心代码
冒泡排序算法
bool bubbleSort(vector<int> array){
int arraySize = array.size();
if (arraySize < 1) return false;
// 遍历次数
for(int i = 0;i < arraySize - 1;i ++) {
// 交换次数
for(int j = 0;j < arraySize - 1; j++) {
if(array[j + 1] < array[j]){
// 如果后面的元素小于前面的元素,就进行交换
int temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
}
}
}
return true;
}
优化冒泡排序算法
bool optimizeBubbleSort(vector<int> array){
int arraySize = array.size();
if (arraySize < 1) return false;
// 遍历次数
for(int i = 0;i < arraySize - 1;i ++) {
// 设定 flag 用于标记每一次排序是否存在交换情况
int flag = 0;
for(int j = 0;j < arraySize - 1; j++) {
if(array[j + 1] < array[j]){
int temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
flag = 1; // 存在交换,将 flag 置为 1
}
}
if (!flag) break; // 如果flag == 0 说明此次排序不存在交换的情况,直接结束排序
}
return true;
}
3. 运行代码
#include <iostream>
#include <cstdlib>
#include <ctime>
#include<algorithm>
#include <vector>
using namespace std;
// 注册一个随机数数组,长度为 n
vector<int> createRandomVector(int n, int a = 1, int b = 100){
// 初始化随机数生成器
srand(static_cast<unsigned int>(time(nullptr)));
vector<int> randVec;
while(n --){
int random_number = rand() % (b - a + 1);
randVec.push_back(random_number);
}
return randVec;
}
bool output(vector<int> array){
if (array.size() < 1) return false;
for(auto v: array) cout<< v << ' ';
cout<<endl<<endl;
return true;
}
bool bubbleSort(vector<int> array){
cout<<"《普通冒泡排序》" <<endl;
int cnt = 0;
int arraySize = array.size();
if (arraySize < 1) return false;
// 遍历次数
for(int i = 0;i < arraySize - 1;i ++) {
// 交换次数
for(int j = 0;j < arraySize - 1; j++) {
if(array[j + 1] < array[j]){
int temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
}
cnt ++;
}
}
cout<<"一共进行了 { "<< cnt << " } 次循环"<<endl;
cout<<"排序后的数组顺序为:\t"<< ' ';
output(array);
return true;
}
bool optimizeBubbleSort(vector<int> array){
cout<<"《优化冒泡排序》"<<endl;
int cnt = 0;
int arraySize = array.size();
if (arraySize < 1) return false;
// 遍历次数
for(int i = 0;i < arraySize - 1;i ++) {
// 交换次数
int flag = 0;
for(int j = 0;j < arraySize - 1; j++) {
if(array[j + 1] < array[j]){
int temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
flag = 1;
}
cnt ++;
}
if (!flag) break;
}
cout<<"一共进行了 { "<< cnt << " } 次循环"<< endl;
cout<<"后的数组顺序为:\t"<< ' ';
output(array);
return true;
}
int main() {
int n = 10;
vector<int> originArray = createRandomVector(n, 1, 100);
// vector<int> originArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
cout<<"初始数组顺序为:\t"<< ' ';
output(originArray);
// reverse(originArray.begin(), originArray.end());
bubbleSort(originArray);
optimizeBubbleSort(originArray);
return 0;
}
二、选择排序(Selection sort)
- 空间复杂度:O(1)O(1)O(1)
- 平均时间复杂度:O(n2)O(n^2)O(n2)
1. 算法解析
选择排序:在每一轮中,从待排序的数列中找到最小(或最大)的元素,然后将这个元素与当前待排序数列的起始位置的元素进行交换。这个过程会重复进行,直到整个数列都排序完成。
2. 核心代码
bool selectSort(vector<int>& array){
int arraySize = array.size();
if (arraySize < 1) return false;
// i 表示当前待排序数列的起始位置
for (int i = 0;i < arraySize - 1; i ++){
int k = i; // k 用于选择出待排序数列的最小值索引,初始赋值为起始位置,这样
for(int j = i + 1;j < arraySize; j ++){
// 从下一个位置开始寻找
if(array[k] > array[j]) k = j; // 从待排序的数列中寻找最小的元素,k 赋值为该元素的索引
}
swap(array[k], array[i]); // 放置当前最小值到待排序数列的起始位置
}
return true;
}
3. 运行代码
#include <iostream>
#include <cstdlib>
#include <ctime>
#include<algorithm>
#include <vector>
using namespace std;
// 注册一个随机数数组,长度为 n
vector<int> createRandomVector(int n, int a = 1, int b = 100){
// 初始化随机数生成器
srand(static_cast<unsigned int>(time(nullptr)));
vector<int> randVec;
while(n --){
int random_number = rand() % (b - a + 1);
randVec.push_back(random_number);
}
return randVec;
}
bool output(vector<int> array){
if (array.size() < 1) return false;
for(auto v: array) cout<< v << ' ';
cout<<endl<<endl;
return true;
}
bool selectSort(vector<int>& array){
int arraySize = array.size();
if (arraySize < 1) return false;
for (int i = 0;i < arraySize - 1; i ++){
int k = i;
for(int j = i + 1;j < arraySize; j ++){
if(array[k] > array[j]) k = j;
}
swap(array[k], array[i]);
}
return true;
}
int main() {
int n = 10;
vector<int> originArray = createRandomVector(n);
cout<<"初始数组顺序为:\t";
output(originArray);
cout<<"选择排序后的数组顺序为:";
selectSort(originArray);