三、排序算法总结一(冒泡排序,插入排序,选择排序)(C++版本)
一、引言
对于各种排序算法也算是有了一定的了解,所以这里做一个总结。
二、冒泡排序法。
这是比较经典的排序算法,主要是通过内外两层的循环比较,使得乱序变为顺序。
下面是一个测试代码
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> L();
for(int i=;i<L.size();i++)
{
L[i] = - i;
}
int temp = ;
for (int i = ; i < L.size(); i++)
for (int j = L.size()-; j >= (i+); j--)
{
if (L[j-] > L[j ])
{
temp = L[j];
L[j] = L[j - ];
L[j - ] = temp;
}
}
for (int j = ; j < L.size(); j++)
{
cout << "the number is " << L[j] << endl;
}
}
初始化为10-1,最后冒泡排序法的的结果为升序排列。
下面是算法的运行过程。
在第一次循环里面(即i=0的时候):
每一次比较之后数据变化如下:
随着 i 的增大,蓝色区域扩展如下:
最后达到有序状态。
从上面的分析可以看出来:
其时间复杂度:O(n 2) (这里的时间,主要花费在了比较运算上面,所以计算的是循环里面的比较次数)
空间复杂度: O(n) (即所有的变量占用的空间)
算法稳定性上来说,属于稳定算法(即两个相同的元素经过排序之后的 先后顺序不变)。
二直接插入排序
插入排序的算法思想是,将待排序的数据看做两个部分,一部分是有序数据A,一部分是无序数据B, 最开始的时候A的规模是0, B是整个的待排序数据。
之后对于B中的每一个数据,按照顺序插入到A中,直至整个过程完成。
例如,对于一个待排序数组来说,过程如下:
#include <iostream>
using namespace std;
void Sorted(int* x, int length);
int main(void)
{
int a[]={,,,,};
Sorted(a,);
for(int i=;i<;i++)
cout<<"-----------"<<a[i]<<endl;
return ;
} void Sorted(int* x, int length)
{
for(int i=; i<length;i++ )
{
int temp=x[i];
int j=i-;
while( j>= && temp<x[j])
{
x[j+]=x[j];
x[j]=temp;
j--;
}
}
}
在上面的例子里面:
a[]={,,,,};
在每一步的运算过程中,其数据的变化如下:
上述描述了比较的过程。
柱状图表表示了每一个位置的数字大小,蓝色区域为无序部分,黄色部分为经过一次运算之后的有序部分。
其主要步骤是,选择无序部分的第一个元素,将其插入到黄色的有序部分里面去,这样黄色区域扩展,而蓝色区域则是不断地减小,直至所有的区域变为有序状态。
复杂度分析:
可以看到,上述过程,主要操作是比较操作,然后是赋值操作,其中赋值操作的所花费的时间更长
在最好的情况下,整个数据正好是升序排列的,这个时候比较操作是(n-1),赋值操作 复杂度为0
在最坏的情况下,整个数据是降序排列的,这个时候比较次数是 n*(n-1)/2 次,赋值操作是4*n*(n-1)/2, 主要的时间花在了赋值的操作上,时间复杂度为O(n2)
稳定性来说,这个算法是不稳定的,即相同的两个元素,在排序前和排序之后,先后次序可能发生了改变。
三、选择排序
选择排序的思想与上面的插入排序相同,将数据分为有序部分和无序部分。
在无序部分里面选择出最值(比如说是最大值,放到有序部分),这样经过不断的选择无序部分的最大值,使得有序部分不断的扩展,无序部分不断地缩小,最后得到整个有序数据序列。
具体代码如下:
#include <iostream>
using namespace std;
void Sorted(int* x, int length);
int main(void)
{
int a[] = { ,,,,};
Sorted(a, );
for (int i = ; i < ; i++)
cout << "-----------" << a[i] << endl;
return ;
} void Sorted(int* x, int length)
{
int max = ;
int len = length - ; for (int i = ; i <= length-; i=i+)
{
max = x[];
int j = ;
int number = ;
for (j = ; j <= len; j++)
{
if (max < x[j])
{
max = x[j];
number = j;
}
}
int temp = x[len];
x[len] = max;
x[number] = temp;
len--;
}
}
其每一次的比较过程如下:
如图可以看到,有序的黄色区域在不断的扩展,无序部分在逐渐减少。
复杂度:
最好情况:全是升序排列,这个时候只需要(n-1)次比较
最坏情况:全是降序排列,这个时候需要(n-1)*n/2次比较,(n-1)次互换操作,时间复杂度在O(n) (这里只是考虑了互换操作), 比冒泡排序法快
稳定性:不稳定
三、排序算法总结一(冒泡排序,插入排序,选择排序)(C++版本)的更多相关文章
- PHP算法排序之快速排序、冒泡排序、选择排序、插入排序性能对比
<?php //冒泡排序 //原理:从倒数第一个数开始,相邻的两个数比较,后面比前面的小,则交换位置,一直到比较第一个数之后则最小的会排在第一位,以此类推 function bubble_sor ...
- 【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序
最近在准备笔试题和面试题,把学到的东西整理出来,一来是给自己留个笔记,二来是帮助大家学习. 题目: 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: 输入:[1,2,3,5,2, ...
- 排序方法整理Java - 冒泡排序、选择排序、插入排序、快速排序
/** * 排序方法整理 * @author zhyea * */ public class Sort { /** * 冒泡排序,从小到大. * 冒泡排序是比较相邻的两个元素,若顺序错误,则执行交换. ...
- JavaScript中数组的排序方法:1.冒泡排序 2.选择排序
//1.选择排序: //从小到大排序:通过比较首先选出最小的数放在第一个位置上,然后在其余的数中选出次小数放在第二个位置上,依此类推,直到所有的数成为有序序列. var arr2=[19, 8, ...
- 《算法4》2.1 - 选择排序算法(Selection Sort), Python实现
选择排序算法(Selection Sort)是排序算法的一种初级算法.虽然比较简单,但是基础,理解了有助于后面学习更高深算法,勿以勿小而不为. 排序算法的语言描述: 给定一组物体,根据他们的某种可量化 ...
- JavaScript算法(冒泡排序、选择排序与插入排序)
冒泡排序.选择排序与插入排序复杂度都是二次方级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看 ...
- Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析
前言:排序在算法中的地位自然不必多说,在许多工作中都用到了排序,就像学生成绩统计名次.商城商品销量排名.新闻的搜索热度排名等等.也正因为排序的应用范围如此之广,引起了许多人深入研究它的兴趣,直至今天, ...
- 【排序算法】——冒泡排序、选择排序、插入排序、Shell排序等排序原理及Java实现
排序 1.定义: 所谓排序,即是整理文件中的内容,使其按照关键字递增或递减的顺序进行排列. 输入:n个记录,n1,n2--,其对应1的关键字为k1,k2-- 输出:n(i1),n(i2)--,使得k( ...
- java面向对象的冒泡排序,选择排序和插入排序的比较
这三种排序有俩个过程: 1.比较俩个数据. 2.交换俩个数据或复制其中一项. 这三种排序的时间级别 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换 0 ...
- 「浙江理工大学ACM入队200题系列」问题 A: 零基础学C/C++34—— 3个数比较大小(冒泡排序与选择排序算法)
本题是浙江理工大学ACM入队200题第四套中的A题,同时给出了冒泡排序和选择排序算法 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习 ...
随机推荐
- alluxio 安装记录及相关信息
最近要尝试探究一下alluxio相关的知识,本博客进行对alluxio的安装过程进行备忘: 单例安装过程: https://docs.alluxio.io/os/user/stable/cn/cont ...
- Python3——根据m3u8下载视频(上)之urllib.request
干活干活,区区懒癌已经阻挡不了澎湃的洪荒之力了...... 运行环境:Windows基于python3.6 ---------------------------------------------- ...
- 【Autoit】Autoit 使用
一.Autoit 上传文件. 1.常用语法 - WinActivate("title") 聚焦到指定活动窗口 - ControlFocus ( "titl ...
- CSS新特性之动画
动画是CSS3中具有颠覆性的特征之一,可以通过设置多个节点来精确控制一个或者一组动画,常常用来实现复杂的动画效果.相比较过度,动画可以实现更多变化,更多控制,连续自动(不需要鼠标经过和鼠标离开来控制) ...
- R基础绘图
本节内容 0:小知识 1:绘图系统散点图的特征 2:基础绘图函数 3:基础绘图参数 4:图形设备 5:案例操作5个图形 0:小知识 summary() ## 对数据框或者向量进行描述性数据 read. ...
- 题解:A
A (a.pas/c/cpp) [题目描述] 对于给定的一个正整数n, 判断n是否能分成若干个正整数之和 (可以重复) , 其中每个正整数都能表示成两个质数乘积. [输入描述] 第一行一个正整数 q, ...
- 第05组 Alpha冲刺(4/4)
第05组 Alpha冲刺(4/4) 队名:天码行空 组长博客连接 作业博客连接 团队燃尽图(共享): GitHub当日代码/文档签入记录展示(共享): 组员情况: 组员1:卢欢(组长) 过去两天完成了 ...
- IDEA2019 Maven项目出现Unable to import maven project: See logs for details解决办法
问题1:Unable to import maven project: See logs for details 网上说,原因是IDEA2019和Maven3.6.2不兼容导致的,需要把Maven降级 ...
- 【UOJ276】【清华集训2016】汽水(分数规划+点分治)
点此看题面 大致题意: 给你一棵树,要求你选择一条树上路径,使得这条路径上边权的平均值与定值\(k\)的差的绝对值最小.求出这个最小值. 分数规划 看到平均值,首先就应该想到分数规划吧. 我们二分答案 ...
- SVO稀疏图像对齐代码分析
SVO使用稀疏直接法计算两帧之间的初始相机位姿,即使用两帧之间稀疏的4*4 patch的光度误差为损失函数,使用G-N优化算法获得两帧之间的位姿变换,由于没有特征匹配过程效率较高.相比自己实现的稀疏直 ...