十大排序算法 — — 代码总结

十大排序算法 — — 代码总结

一、冒泡排序(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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值