一、主要思想

  • 原地重排(名次):计算数组中元素的名次,将元素交换到索引为名次的位置
  • 选择排序:在数组的前size长度中,选择最大的元素交换到数组的末尾
  • 冒泡排序:在数组的前size长度中,相邻元素两两相比,每次都将当前最大的元素沉到数组末尾
  • 插入排序:将数组中当前有序部分的后一个元素插入前面的有序部分中

及时终止的xx排序:若当前数组有序(数组中相邻元素,后>前),则不再进行相关主要操作,直接退出

二、算法思想的图展示

说明:橙色格子代表有序;灰色格子代表无序;红色字体代表当前比较的数组元素

  • 选择排序
  • 冒泡排序(一次冒泡的图展示)
  • 插入排序

三、实现代码

#include<iostream>
using namespace std;template <class T>//名次排序
void rank_sorted(T a[], int n)
{//按名次排序:将a中的元素移到相对应的名次位置中//名次计算:某元素的名次为比它小的元素个数+它左边与它相同的元素个数T *r = new T[n];for (int i = 0; i < n; i++)r[i] = 0;for (int i = 1; i < n; i++){for (int j = 0; j < i; j++){if (a[j] <= a[i])r[i]++;elser[j]++;}}/*for (int i = 0; i < n; i++){swap(a[i], a[r[i]]);swap(r[i], r[r[i]]);}//swap函数定义:temp = right;right = left;left = temp;交换2个元素,移动3次因此,如上表达的名次排序移动了6n次*/T *temp = new T[n];for (int i = 0; i < n; i++)temp[r[i]] = a[i];for (int i = 0; i < n; i++)a[i] = temp[i];/*如上表达的名次排序借助临时数组temp,移动了2n次*/}template <class T>//选择排序
void select_sorted(T a[], int n)
{//选择排序:前size个元素中选择最大的与末尾元素交换,排到最后for (int i = n - 1; i > 1; i--){//计算当前长度为i的数组,其中最大元素的索引int max_index = 0;for (int j = 1; j <= i; j++)if (a[max_index] < a[j])max_index = j;//由swap函数的定义可知,移动次数为3(n-1)swap(a[max_index], a[i]);}}template <class T>//冒泡排序
void bubble_sorted(T a[], int n)
{//冒泡排序:相邻元素比较,谁大谁靠后,交换元素,把最大元素移到当前最后for (int i = n; i > 1; i--) //需要n-1次冒泡for (int j = 0; j < i - 1; j++)if (a[j] > a[j + 1]) //一次冒泡n-1次比较swap(a[j], a[j + 1]);}template <class T>//原地重排(名次排序的不需要额外数组版)
void rank_noArray_sorted(T a[], int n)
{//原地重排:同名次排序,但不需要额外数组空间T *r = new T[n];for (int i = 0; i < n; i++)r[i] = 0;for (int i = 1; i < n; i++)for (int j = 0; j < i; j++)if (a[j] <= a[i])r[i]++;elser[j]++;for (int i = 0; i < n - 1; i++){if(i != r[i]){swap(a[i], a[r[i]]);swap(r[i], r[r[i]]);}}//如果有序,数组不用交换//最少交换0次,最多交换2(n-1)次}template <class T>//及时终止的选择排序
void select_stop_sorted(T a[], int n)
{/*//正常选择排序:for (int i = n - 1; i >= 1; i--){int max_index = 0;for (int j = 1; j <= i; j++)if (a[j] > a[max_index])max_index = j;swap(a[max_index], a[i]);}*///及时终止的选择排序:若原数组有序,则不需要执行循环操作bool sorted = false;//假设刚开始为无序for (int i = n - 1; !sorted && i >= 1; i--){sorted = true;//假设为有序int max_index = 0;for (int j = 1; j <= i; j++)if (a[j] > a[max_index])//后一个总比前一个大为有序,否则为无序max_index = j;elsesorted = false;//只要出现后一个比前一个小swap(a[max_index], a[i]);}}template <class T>//及时终止的冒泡排序
void bubble_stop_sorted(T a[], int n)
{/*//冒泡排序:for (int i = n; i > 1; i--){for (int j = 0; j < i - 1; j++)if (a[j] > a[j + 1])swap(a[j], a[j + 1]);}*///及时终止的冒泡排序:有序时终止bool swapped = true;for (int i = n; swapped && i > 1; i--)for (int j = 0; j < i - 1; j++)if (a[j] < a[j + 1])swapped = true;elseswap(a[j], a[j + 1]);}template <class T>//插入排序
void insert_sorted(T a[], int n)
{/*for (int i = 1; i < n; i++){T insert_val = a[i]; //待插入元素for (int j = 0; j < i; j++){if (a[i] < a[j]){for (int temp = i; temp > j; temp--)a[temp] = a[temp - 1];a[j] = insert_val;break;}}}*///课本版代码:for (int i = 1; i < n; i++){T insert_val = a[i];int j;for (j = i - 1; j >= 0 && insert_val < a[j]; j--)a[j + 1] = a[j];a[j + 1] = insert_val;}}int main(void)
{int n;cin >> n;int *a = new int[n];for (int i = 0; i < n; i++)cin >> a[i];//rank_sorted<int>(a, n);//select_sorted<int>(a, n);//bubble_sorted<int>(a, n);//rank_noArray_sorted<int>(a, n);//select_stop_sorted<int>(a, n);//bubble_stop_sorted<int>(a, n);insert_sorted<int>(a, n);for (int i = 0; i < n; i++)cout << a[i] << " ";system("pause");return 0;
}

排序算法:原地(名次)、选择、冒泡、插入相关推荐

  1. 排序算法六:选择排序之直接选择排序

    排序算法六:选择排序之直接选择排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评& ...

  2. Java常见排序算法之直接选择排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  3. 排序算法:简单选择排序算法实现及分析

    简单选择排序算法介绍 简单选择排序(Simple Selection Sort)就是通过n-1次关键字排序之间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i(1<=i<=n)记 ...

  4. java选择排序代码_Java排序算法总结之选择排序

    本文实例讲述了Java排序算法总结之选择排序.分享给大家供大家参考.具体分析如下: 选择排序的基本操作就是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部 ...

  5. Java排序算法之直接选择排序

    Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...

  6. js排序算法详解-选择排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-选择排序 相对于冒泡排序还有一种类似的方法就是选择排序,顾名思义就是选择性排序,什么意思呢? 这么来理解,假设 ...

  7. 《数据结构与算法》实验:排序算法实验比较——选择排序 堆排序

    <数据结构与算法>实验和课程Github资源 <数据结构与算法>实验:线性结构及其应用--算术表达式求值 <数据结构与算法>实验:树型结构的建立与遍历 <数据 ...

  8. C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法

    选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...

  9. python算法题排序_python-数据结构与算法- 面试常考排序算法题-快排-冒泡-堆排-二分-选择等...

    算法可视化网站推荐---->visualgo 0.面试题中的排序算法 一些排序算法可能在工作中用的会比较少,但是面试却是不得不面对的问题.算法有助于提高我们对数据结构的理解以及提高自己的逻辑能力 ...

  10. 排序算法 | 快排、冒泡、堆排、归并、基数、递归、希尔、计数

    文章目录 写在前面 排序 1. 基数排序`稳定` 2. 归并排序`稳定`merge sort 3. 快速排序`不稳定`quick sort 4. 堆排序`不稳定`heap sort 大根堆 小根堆 5 ...

最新文章

  1. json boolean android,如何解析Android中的JSON?
  2. Linux下升级安装Python-2.7.8版本
  3. php 字符串 中文位置,怎样查找中文字符的位置呢
  4. java rgb转yuv_【转】总结各种RGB转YUV的转换公式
  5. [转载] 《Python语言程序设计》课程笔记
  6. php截取字符串几位数,php按照指定长度截取字符串的代码
  7. shiro springboot 整合
  8. logstash 使用glusterfs网络存储偶发性文件解析异常的问题
  9. 【Flink】Generic types have been disabled in the ExecutionConfig and type KryoSerializer Row
  10. chord协议模拟实现_VB.NET和单片机串口通信实现监控单片机数字量输入继电器输出模拟量输入模拟量输出...
  11. 通知!7月SCI/SSCI/EI目录已更新,大批中科院1-4区好刊,请查收!
  12. matlab解隐式差分格式,【毕业设计(论文)】二维热传导方程有限差分法的MATLAB实现...
  13. Python批量检测域名是否被注册
  14. 计算机开机出现代码卡顿,电脑开机后很卡怎么办
  15. JAVA编程学习记录(内部类)
  16. 绝热锥形与adc psr
  17. 喜讯!神策数据荣登 2022 年度数字化保险百强榜
  18. JAVA中native方法调用C语言实现学习
  19. Openharmony应用NAPI详解--进阶篇1
  20. Android .9图片使用报错...报错:AAPT: error: file failed to compile.

热门文章

  1. Python语言的特点有哪些
  2. AKH-0.66 MP-80×50 系列电流互感器(安科瑞-卓宋兰)
  3. 在Flutter中使用SetState无效?可能是忽略了这个!
  4. 如何向linux中添加头文件,linux添加头文件路径
  5. 什么是redis?redis的作用是什么?
  6. 微信小程序网络请求异常怎么办_监控微信小程序wx.request请求失败
  7. 爬取一周天气获取24小时温度+数据可视化
  8. mac如何将word中的公式转为latex格式
  9. Linux目录结构及基础命令——看两眼就学会啦!!!
  10. 想知道怎样p漫画脸??用这两个方法,分分钟出片