一学就废的三种简单排序【冒泡、插入、选择】

文章目录

  • 其他排序算法
  • 冒泡排序
    • 算法实现
    • 代码实例
  • 插入排序
    • 算法实现
    • 代码实例
  • 选择排序
    • 算法实现
    • 代码实例


其他排序算法

一学就废的归并排序


冒泡排序

排列顺序从前到后或者从后往前都可,本文选择从后到前的顺序,升序排列:比较相邻两个元素,大的放后面,小的放前面,(降序排列反之)第一个for决定排列数组下标为i的元素,第二个for执行i遍比较过程。
点击这里可以看到动画版的冒泡排序【一个很有趣的网站】


算法实现

void sort(int* a,int len){//冒泡排序,a为数组首地址,len为数组长度int temp;for(size_t i = len; 0 < i; i--){//确定数组下标为i的元素for(size_t j = 0; j < i; j++){//执行i遍比较过程if(a[j+1] < a[j]){temp = a[j+1];a[j+1] = a[j];a[j] = temp;}}}
}

代码实例

#include <iostream>
using namespace std;void sort(int* a,int len){int temp;for(size_t i = len; 0 < i; i--){//冒泡排序for(size_t j = 0; j < i; j++){if(a[j+1] < a[j]){temp = a[j+1];a[j+1] = a[j];a[j] = temp;}}}
}int main(int argc, char const *argv[]) {int n;while (cin>>n,n) {int a[n];for(int i=0;i < n; i++){cin >> a[i];}int len = sizeof(a)/sizeof(a[0]);sort(a,len);for (int i = 0; i < n; i++) {cout << a[i] << " ";}cout << endl;}}

插入排序

排列顺序从前到后或者从后往前都可,本文选择从前到后的顺序,每次要确定的数组元素的值要先存入一个临时变量中(例如下面的temp),再将它之前的元素与它比较,比它大的都往后移动一位(降序排列操作反之),例如:a[7]={1,3,5,2,4,8,7}中,假设此时已经过3轮排序,该执行第4轮排序时,将2赋值给temp,之后将3,5向后移,然后将temp的值赋给a[2],这样就相当于做了一个将2插入1,3之间的操作。每个元素都做这样一个操作之后,整个数组便完成排序了。

ps:上文的网站也可以看插入排序


算法实现

void sort(int* a,int len) {//插入排序,升序排列int temp,i,j;for(i = 1; i < len; i++){//决定第i个元素temp = a[i];//先将要插入的值赋给临时变量防止以数据丢失for(j = i; 0 < j; j--){//执行i遍比较if(temp < a[j-1]){//a[i]之前的元素比temp大的往后移一位a[j] = a[j-1];}else{break;//找到了该插入的位置,退出本层循环,决定下一个元素的位置}}a[j] = temp;//将元素插入到其该存在的位置}
}

代码实例

#include<iostream>
using namespace std;void sort(int* a,int len) {//插入排序,升序排列int temp,i,j;for(i = 1; i < len; i++){//决定第i个元素temp = a[i];for(j = i; 0 < j; j--){//执行i-1遍比较if(temp < a[j-1]){a[j] = a[j-1];}else{break;}}a[j] = temp;}
}int main(int argc, char const *argv[]) {int n;while (cin>>n,n) {int a[n];for(int i=0;i < n; i++){cin >> a[i];}int len = sizeof(a)/sizeof(a[0]);sort(a,len);for (int i = 0; i < n; i++) {cout << a[i] << " ";}cout << endl;}return 0;
}

选择排序

排列顺序从前到后或者从后往前都可,本文选择从前到后的顺序,每次要确定的数组元素的值要先存入一个临时变量中(例如下面的min),再将它之后的元素与它比较,如果某位置的元素比该位置元素值小(降序排列操作反之),则交换两个位置的元素,并更新min的值,例如:a[7]={1,4,5,3,2,8,7}中,假设此时已经过1轮排序,该执行第2轮排序时,将4赋值给min,之后判定到a[3]时,发现min的值大于a[3](4>3),交换a[1]和a[3]的元素,也就是数组变成了a[7]={1,3,5,4,2,8,7},并更新min的值(min = 3),接下来继续往后比较时发现min的值大于a[4] (3>2),则重复之前的操作,交换a[1]与a[4]的内容,也就是数组变成了a[7]={1,2,5,4,3,8,7},并更新min的值(min = 2),之后再无数组元素值小于min,遍历完成,一轮排序结束。每个位置(除了最后一个位置,其他位置排好了之后,最后一个位置的元素自然而然就排好了)都做这样一个操作之后,整个数组便完成排序了。
ps:上文的网站也可以看选择排序


算法实现

void sort(int* a,int len) {//选择排序,升序排列int min,i,j;for(i = 0; i < len-1; i++){//确定数组下标为i的元素min = a[i];//min作为临时变量存储当前最小的值for(j = i+1; j < len; j++){//执行n-i-1遍比较if(min > a[j]){//如果j位置的元素比i位置元素值小,则交换两个位置的元素,并更新min的值a[i] = a[j];a[j] = min;min = a[i];}}}
}

代码实例

#include<iostream>
using namespace std;void sort(int* a,int len) {//选择排序,升序排列int min,i,j;for(i = 0; i < len-1; i++){//确定数组下标为i的元素min = a[i];//min作为临时变量存储当前最小的值for(j = i+1; j < len; j++){//执行n-i-1遍比较if(min > a[j]){a[i] = a[j];a[j] = min;min = a[i];}}}
}int main(int argc, char const *argv[]) {int n;while (cin>>n,n) {int a[n];for(int i=0;i < n; i++){cin >> a[i];}int len = sizeof(a)/sizeof(a[0]);sort(a,len);for (int i = 0; i < n; i++) {cout << a[i] << " ";}cout << endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百战c++(2)

delete 和 delete []的真正区别 delete 对应 new delete[]对应new[]对于简单类型包括简单类型数组&#xff0c;delete 与delete[]没有区别。对于自定义类型数组&#xff0c;delete 只会删除一个元素&#xff0c;delete 则会删除所有元素。 指针和数组的区别 野指针是什么 野指…

shell预先定义的特殊变量

文章目录$#$*$$$# 表示命令行上参数的个数&#xff0c;但不包括shell脚本名本身 为脚本ex1赋予两个变量&#xff0c;测试$#的输出结果 [cmybogon test2]$ . ex1 ma.c mb.c 2 # echo $# 7 # cat $1 $2 $3 | wc -l 2 # echo $#脚本ex1的具体内容 [rootlocalhost test]$ cat ex1…

Linux实验一:常用的Linux命令

文章目录一、实验目的二、实验要求三、实验内容1、系统的使用2、命令的使用3、文件操作4、系统询问与权限口令5、其它常用命令四、实验操作1、基本命令的使用2、文件和目录操作3、创建用户帐户一、实验目的 1、熟悉Linux的桌面环境&#xff1b; 2、了解Linux所安装的软件包 3、…

Linux实验二:vi编辑器的使用

文章目录一、实验目的二、实验要求三、实验内容1、创建文件2、编辑文件一、实验目的 1、练习并掌握Linux提供的vi编辑器来编译C程序 2、学会利用gcc、gdb编译、调试C程序 3、本次实验的目的是让同学们了解如何使用vi编辑器进行创建和编辑文件 二、实验要求 1、文件编辑器vi…

百战c++(os1)

Linux中的锁 互斥锁&#xff1a;mutex&#xff0c;用于保证在任何时刻&#xff0c;都只能有一个线程访问该对象。当获取锁操作失败时&#xff0c;线程会进入睡眠&#xff0c;等待锁释放时被唤醒 读写锁&#xff1a;rwlock&#xff0c;分为读锁和写锁。处于读操作时&#xff0…

Linux实验三:Shell编程

文章目录一、实验目的二、实验要求三、实验内容1、通配符的使用2、重定向3、管道4、shell变量5、建立下面的脚本&#xff0c;运行并分析输出结果&#xff0c;并给出代码注释。6、编写脚本一、实验目的 1.为文件扩展名使用通配符 2.标准输入、标准输出和标准错误的重定向 3.使…

a href=#与 a href=javascript:void(0) 的区别

a href"#"> 点击链接后&#xff0c;页面会向上滚到页首&#xff0c;# 默认锚点为 #TOP<a href"javascript:void(0)" onClick"window.open()"> 点击链接后&#xff0c;页面不动&#xff0c;只打开链接<a href"#" οnclick&…

Linux实验四:编译和调试工具的使用

文章目录一、实验目的&#xff1a;二、实验要求三、实验内容四、实验操作1、用gcc编译程序&#xff0c;写出编译过程&#xff0c;并给出运行结果。2、调试程序&#xff0c;要求用gdb进行调试并给出修改方案。3、make的使用一、实验目的&#xff1a; 1、练习并掌握Linux提供的v…

Linux实验五:Linux环境下的C语言编程

文章目录一、实验目的&#xff1a;二、实验要求三、实验内容1、编写一段C语言程序使其完成&#xff1a;父进程创建两个子进程&#xff0c;每个进程都在屏幕上显示自己的进程ID号。2、上机调试下面的程序&#xff0c;观察运行结果&#xff0c;分析原因。3、利用两个管道进行双向…

百战c++(4)

1.求下面函数的返回值&#xff08;微软&#xff09; int func(x) { int countx 0; while(x) { countx ; x x&(x-1); } return countx; } 假定x 9999。 答案&#xff1a;8 思路&#xff1a;将x转化为2进制&#xff0c;看含有的1的个数。 2. 什么是“引用”&…

ndarray对象的建立

文章目录ndarray&#xff08;别名array&#xff09;常用属性创建NumPy数组使用array()函数使用zeros()函数使用ones()函数使用empty()函数使用arange()函数注意ndarray&#xff08;别名array&#xff09; 常用属性 import numpy as np # Numpy工具包data np.arange(12).res…

百战c++(5)

11. 已知strcpy的函数原型&#xff1a;char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串&#xff0c;strSrc 是源字符串。不调用C/C 的字符串库函数&#xff0c;请编写函数 strcpy。 答案&#xff1a; char *strcpy(char *strDest, const char *strS…

Numpy数组的广播机制

文章目录前言数组广播广播机制的使用条件前言 Numpy数组不需要循环遍历&#xff0c;即可对每个元素执行批量的算术运算操作&#xff08;矢量化运算&#xff09;。当两个数组大小&#xff08;Numpy.shape&#xff09;不同时&#xff0c;进行算术运算会出现广播机制。 数组广播…

百战c++(6)

26. 描述内存分配方式以及它们的区别? 1&#xff09; 从静态存储区域分配。内存在程序编译的时候就已经分配好&#xff0c;这块内存在程序的整个运行期间都存在。例如全局变量&#xff0c;static 变量。 2&#xff09; 在栈上创建。在执行函数时&#xff0c;函数内局部变量的…

Spring3.1.0+Quartz1.8.6整合实现计划任务

1.首先要加入任务计划的相关的jar包&#xff0c;这里除了需要加Spring3.1.0的jar&#xff0c;还需要加quartz-all-1.8.6.jarslf4j-api-1.5.8.jar slf4j-log4j12.jar这三个包&#xff0c;如果你是SSH整合的项目&#xff0c;里面有下面的两个包了&#xff0c;就可以不加&#xff…

百战c++(7)

40. 链表题&#xff1a;一个链表的结点结构 struct Node { int data ; Node *next ; }; typedef struct Node Node ; (1)已知链表的头结点head,写一个函数把这个链表逆序 ( Intel) Node * ReverseList(Node *head) //链表逆序 { if ( head NULL || head->next NU…

数组的转置和轴对称

文章目录T属性transpose()方法swapaxes()方法T属性 import numpy as np # Numpy工具包data np.arange(12).reshape(3, 4) # 创建一个3行4列的数组 print(data)# 数组的转置和轴对称 data1 data.T print(data1)print(data) [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] print(dat…

百战c++(8)

43. 写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数。 KMP算法效率最好&#xff0c;时间复杂度是&#xff2f;(nm)。 44. 多重继承的内存分配问题&#xff1a; 比如有class A : public class B, public class C {} 那么A的内存结构大致是怎么样的&#xff1f; 这…

管道实现父子进程的信息传递(一)【fork函数、pipe函数、write/read操作、wait函数】

文章目录题目描述代码实现关于pipe函数关于读写操作关于读写端口关于wait函数功能&#xff1a;注意&#xff1a;关于fork函数题目描述 编写一个程序&#xff0c;利用管道实现父子进程的通信&#xff0c;父进程向子进程发送信息&#xff0c;由子进程输出显示。 代码实现 #inclu…

基础的shell编程问题(一)

文章目录题目一题目描述代码实现关于$#的有关内容实测本程序的作用题目二题目描述代码实现注释关于argc、argv关于read函数关于文件描述符关于write函数本程序的作用题目三题目描述代码实现实测关于grep命令关于read命令题目四题目描述代码实现关于test命令实测题目一 题目描述…