C++ 排序算法(选择、冒泡、插入)

八、选择排序(从小到大):

选择排序的基本思想是:每一趟从待排序的数据中,通过"打擂台"比较选出最小元素,放在这些数据的最前面。

这样,第一趟把 n 个数中(第 1 个到第 n 个)最小的放在第一个位置,

第二趟把剩余的 n-1 个数中(第 2 个到第 n 个)最小的放在第二个位置,

第三趟把剩余的 n-2 个数中(第 3 个到第 n 个)最小的放在第三个位,......

第 n-1 趟把剩下的 2 个数中(第 n-1 个到第 n 个)最小的放在第 n-1 个位置,

剩下的最后一个数(第 n 个)一定最大,自然落在了第 n个位置。

选择排序代码:(从小到大)

#include<iostream>

using namespace std;

int main(){

int n,i,j,k,temp,h101;

cin >> n;

for(i = 1; i <= n; i++) cin >> hi;

for(i = 1; i <= n; i++){

k = i; // 定义k为最小的位置

for(j = i+1; j <= n; j++)

if(hj < hk) k = j;// 在 i~n 之间的最小元素

temp = hi;

hi = hk; // 把最小的放到第一个位置i ,依次第二个位置...

hk = temp;// 将 i~n 之间的最小元素放到第 i 个位置

}

for(i = 1; i < n; i++) cout << hi << " " ;

cout << hn << endl;

return 0;

}

九、冒泡排序(从小到大):

冒泡排序的基本思想是:从第一个数开始,依次不断比较相邻的两个元素,如果"逆序"就交换。

这样,一趟排序结束后,最大的元素就放在了第 n 个位置了。

第二趟把剩余的前 n-1 个数中最大的交换到第 n-1 个位置,

第三趟把剩余的前 n-2 个数中最大的交换到第 n-2 个位置,......

经过 n-1 趟,排序结束。

冒泡排序代码:(从小到大)

#include<iostream>

using namespace std;

int main(){

int n,i,j,temp,h101;

cin >> n;

for(i = 1; i <= n; i++) cin >> hi;

for(i = 1; i < n; i++)

for(j = 1; j <= n-i; j++)

if(hj > hj+1){

temp = hj;

hj = hj+1;

hj+1 = temp;

}

for(i = 1; i < n; i++) cout << hi << " " ;

cout << hn << endl;

return 0;

}

十、对于冒泡排序,我们还可以做些算法"优化"。

如果一趟排序下来,都没有任何"逆序"数对,即没有发生"交换"操作,

则说明已经排好序了。此时,就可以立刻退出循环。

优化后的冒泡排序:

#include<iostream>

using namespace std;

int main(){

int n,i,j,temp,h101;

cin >> n;

for(i = 1; i <= n; i++) cin >> hi;

for(i = 1; i < n; i++){

bool flag = true;

for(j = 1; j <= n-i; j++)

if(hj > hj+1){

temp = hj;

hj = hj+1;

hj+1 = temp;

flag = false;

}

if(flag) break;

}

for(i = 1; i < n; i++) cout << hi << " " ;

cout << hn << endl;

return 0;

}

十一、插入排序(从小到大):

插入排序的基本思想是:把所有待排序元素分成前后两段,前一段是已经排好序的,后一段是待排序的。

每一趟都是把后一段的第一个数"插入"到前一段的某一个位置,保证前一段仍然是有序的。

开始时,第 1 个数作为前一段肯定是有序的;第一趟,把第 2 个数插入进去,保证前 2个数有序;

第二趟,把第 3 个数插入进去,保证前 3 个数有;......

第 n-1 趟,把第 n 个数插入进去,保证 n 个数都有序。

插入排序的代码(从小到大):

#include<iostream>

using namespace std;

int main(){

int n,i,j,k,temp,h101;

cin >> n;

for(i = 1; i <= n; i++) cin >> hi;

for(i = 2; i <= n; i++){

temp = hi;

k = 1;

while(hk <= temp && k < i) k++;

for(j = i-1; j >= k; j--) hj+1 = hj;

hk = temp;

}

for(i = 1; i < n; i++) cout << hi << " " ;

cout << hn << endl;

return 0;

}

相关推荐
凯瑟琳.奥古斯特23 分钟前
力扣1009补码解法C++实现
开发语言·c++·算法·leetcode·职场和发展
KaMeidebaby27 分钟前
卡梅德生物技术快报|蛋白的叠氮基修饰:实操解析:核酸模板耦合蛋白的叠氮基修饰实现靶蛋白定点共价标记
前端·人工智能·物联网·算法·百度
通信仿真爱好者2 小时前
第【60期】--大规模MIMO系统信号检测算法误码率比较 --matlab完整代码+参考文章
算法·matlab·mimo·信号检测
AI科技星2 小时前
全域谱分析:无穷维超复数信息场分形统一场论——自然、量子、金融多重分形第一性原理完整体系(中英双语终稿)
人工智能·python·算法·金融·乖乖数学·全域数学
先吃饱再说3 小时前
为什么堆能 O(log n) 插入?拆解完全二叉树的数组魔法
算法·排序算法
zh_xuan3 小时前
c++ optional用法
开发语言·c++·optional
留白_3 小时前
【决策树】泰坦尼克号生存预测
算法·决策树·机器学习
hqzing4 小时前
鸿蒙 PC 底层开发技术详解(七):二进制自签名算法的实现
算法·华为·harmonyos
AI科技星4 小时前
超复数全域经济周期场与信息谱场——金融与密码学底层理论重构《0·1·∞三元一体全域超复数统一场论》系列全集(六一字不漏完整合订终版)
人工智能·算法·金融·密码学·拓扑学·乖乖数学·全域数学
AI科技星4 小时前
《01无穷全域信息场论:算子G与宇宙本体高维完备公理大典》
人工智能·python·算法·金融·乖乖数学·全域数学