首页 > 编程语言 >C++ 排序算法(选择、冒泡、插入)

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

时间:2024-10-16 16:18:16浏览次数:11  
标签:cout temp int 个数 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,h[101];    
    cin >> n;
    for(i = 1; i <= n; i++) cin >> h[i];
    for(i = 1; i <= n; i++){
         k = i;    // 定义k为最小的位置 
         for(j = i+1; j <= n; j++)
             if(h[j] < h[k]) k = j;// 在 i~n 之间的最小元素
         temp = h[i];
         h[i] = h[k];   // 把最小的放到第一个位置i ,依次第二个位置... 
         h[k] = temp;// 将 i~n 之间的最小元素放到第 i 个位置
    }
    for(i = 1; i < n; i++) cout << h[i] <<  " " ;
    cout << h[n] << 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,h[101];
    cin >> n;
    for(i = 1; i <= n; i++) cin >> h[i];
    for(i = 1; i < n; i++)
         for(j = 1; j <= n-i; j++)
                if(h[j] > h[j+1]){
                           temp = h[j];
                           h[j] = h[j+1];
                           h[j+1] = temp;
                }
    for(i = 1; i < n; i++) cout << h[i] <<  " " ;
    cout << h[n] << endl;
    return 0;
}

十、对于冒泡排序,我们还可以做些算法“优化”。
如果一趟排序下来,都没有任何“逆序”数对,即没有发生“交换”操作,
则说明已经排好序了。此时,就可以立刻退出循环。
#### 优化后的冒泡排序: 
#include<iostream>
using namespace std;
int main(){
    int n,i,j,temp,h[101];
    cin >> n;
    for(i = 1; i <= n; i++) cin >> h[i];
    for(i = 1; i < n; i++){
                         bool flag = true;
                        for(j = 1; j <= n-i; j++)
                                     if(h[j] > h[j+1]){
                                           temp = h[j];
                                           h[j] = h[j+1];
                                           h[j+1] = temp;
                                           flag = false;
                                     }
                         if(flag) break;
    }
    for(i = 1; i < n; i++) cout << h[i] <<  " " ;
    cout << h[n] << 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,h[101];
    cin >> n;
    for(i = 1; i <= n; i++) cin >> h[i];
    for(i = 2; i <= n; i++){
           temp = h[i];
           k = 1;
           while(h[k] <= temp && k < i) k++;
           for(j = i-1; j >= k; j--) h[j+1] = h[j];
           h[k] = temp;
    }
    for(i = 1; i < n; i++) cout << h[i] <<  " " ;
    cout << h[n] << endl;
    return 0;
}

标签:cout,temp,int,个数,C++,++,冒泡,排序
From: https://blog.csdn.net/xzal12/article/details/142946851

相关文章

  • 【数据结构】自己动手写一个C++链表功能
    链表数据结构在操作数据时具有更高的性能,但同时因为其结构的原因会造成时间复杂度为O(N),因此理解链表结构的底层实现能够让我们在开发中对程序的性能进行进一步优化。如果你不知道什么是链表或者时间复杂度,可以参考我另外两篇文章:【数据结构】数组、链表、堆栈、队列到......
  • c++面向对象的两种格式
            面向对象编程(OOP)是C++的一个重要特性,它允许你将代码组织成类(class)和对象(object),从而提高代码的可读性、可维护性和复用性。所以,在项目开发中使用面向对象编程是非常重要的,即便函数也可以提高封装性,但是,类的使用通俗来说,直接将函数封装,同时可以通过继承父类来大......
  • 南沙C++信奥赛陈老师解一本通题 1943:【08NOIP普及组】排座椅
    ​ 【题目描述】上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的DD对同学上课时会交头接耳。同学们在教室中坐成了MM行NN列,坐在第ii行第jj列的同学的位置是(i,ji,j......
  • 每日OJ题_牛客_礼物的最大价值_路径dp_C++_Java
    目录牛客_礼物的最大价值_路径dp题目解析C++代码Java代码牛客_礼物的最大价值_路径dp礼物的最大价值_牛客题霸_牛客网(nowcoder.com)描述:        在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子......
  • 【C++】C++ STL 树形结构容器全解析:map、set、multimap、multiset 的使用与区别
    C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriority......
  • GESP2024年9月认证C++四级( 第一部分选择题(1-5))
    题三代码:#include<iostream>usingnamespacestd;//全局变量var,初始化为100intvar=100;//函数定义voidfunction(){//局部变量var,只在这个函数内部可见,初始化为200intvar=200;//输出局部变量var的值,即200......
  • C++ STL迭代器、resize和reserve区别、map和unordered_map区别,vector和List区别、map
    1.STL迭代器删除元素迭代器失效是指在对容器进行修改时,原有的迭代器可能变得不可用。正确删除元素的方法是使用erase,并返回新的有效迭代器。示例代码#include<iostream>#include<vector>intmain(){  std::vector<int>vec={1,2,3,4,5};  //输出......
  • 实验1 现代C++编程初体验
    四。实验结论1.实验任务1#include<iostream>#include<string>#include<vector>#include<algorithm>usingnamespacestd;//声明//模板函数声明template<typenameT>voidoutput(constT&c);//普通函数声明voidtest1();voidtest2();voi......
  • 实验1 现代C++基础编程
    任务1源代码task1.cpp//本例用到以下内容://1.字符串string,动态数组容器类vector、迭代器//2.算法库:反转元素次序、旋转元素//3.函数模板、const引用作为形参#include<iostream>#include<string>#include<vector>#include<algorithm>usingnamespacestd......
  • 阿里 C++面试,算法题没做出来,,,
    我本人是非科班学C++ 后端和嵌入式的。在我面试的过程中,竟然得到了阿里​C++研发工程师的面试机会。因为,阿里主要是用Java比较多,C++的岗位比较少​,所以感觉这个机会还是挺难得的。阿里C++研发工程师面试考了我一道类似于快速排序算法的算法题,虽然我算法题又一次没做......