C/C++ 知识点---排序实现
1.冒泡排序
冒泡排序是O(N^2)复杂度的排序算法,效率较低,需要N趟遍历,每次将候选集中最小的数通过交换浮到最上面;
template <typename Type>
void BubbleSort(vector<Type> &arraySort, int lowIndex, int hightIndex)
{
bool bChange;
for (int i=lowIndex; i<hightIndex; ++i)
{
bChange = false;
for (int j=hightIndex; j>i; --j)
{
if (arraySort[j-] > arraySort[j])
{
swap(arraySort[j-], arraySort[j]);
bChange = true;
}
} if (!bChange)
{
return;
}
}
}
2.选择排序
选择排序就是每次在候选集合中选择最小的数插入到候选结合的开头,并且不断的缩小候选集合的过程,从算法实现的角度讲,就是要进行N词遍历,每次在候选集合中选择最小的数放在候选集合前部的过程,并且不断的缩小候选集。
template <typename Type>
void SelectSort(vector<Type> &arraySort, int lowIndex, int hightIndex)
{
Type tempMinIndex;
for (int i=lowIndex; i<hightIndex; ++i)
{
tempMinIndex = i;
for (int j=i+; j<hightIndex; ++j)
{
if (arraySort[j] < arraySort[tempMinIndex])
{
tempMinIndex = j;
}
} if (tempMinIndex != i)
{
swap(arraySort[tempMinIndex], arraySort[i]);
}
}
}
3.插入排序
每次将一个数插入到有序的集合中,从算法实现的角度讲,就是进行N趟遍历,每次将第i个数插入到前面有序的集合中,最后达到有序。算法的复杂度为O(N^2),在实现时将第i个数与前面的i-1个数进行比较,如果小于就交换,最后插入到合适的位置。
template <tepename Type>
void InsertSort(vector<Type> &arraySort, int lowIndex, int hightIndex)
{
for (int i=lowIndex+; i<hightIndex; ++i)
{
Type tempValue = arraySort[i];
j = i-;
while (j>= && temValue<arraySort[j])
{
arraySort[j+] = arraySort[j];
--j;
}
arraySort[j+] = tempValue;
}
}
4.快速排序
快速排序是最常用的也算是经典的排序算法,它是通过分治递归的方式实现,通过选取哨兵,并将元素与哨兵比较,按照大小将数组切分成两部分,并对这两部分按照同样的方式进行递归计算,最后达到有序。
template <typename Type>
void QuickSort(vector<Type> &arrarSort, int lowIndex, int hightIndex)
{
int i = lowIndex;
int j = hightIndex;
Type tempValue = arraySort[lowIndex]; while (i < j)
{
while (i<j && arraySort[j]>=tempValue)
{
j--;
}
if (i < j)
{
arraySort[i++] = arraySort[j];
} while (i<j && arraySort[i]<tempValue)
{
i++;
}
if (i < j)
{
arraySort[j--] = arraySort[i];
} QuickSort(arraySort, i+, hightIndex);
QuickSort(arraySort, lowIndex; i-);
} arraySort[i] = tempValue;
}
5.归并排序
归并排序也是用分治递归的思想进行求解,想将小块进行排序,然后合并来实现,归并排序的算法复杂度是O(N*logN),空间复杂度是O(N)
template <typename Type>
void Merge(vector<Type> &arraySort, int leftIndex, int midIndex, int rightIndex)
{
int i = leftIndex;
int j = midIndex+;
int n1 = midIndex-leftIndex+;
int n2 = rightIndex-midIndex;
int k = ; Type *tempArray = new Type[n1+n2];
while (i<=midIndex && j<=rightIndex)
{
if (arraySort[i] < arraySort[j])
{
tempArray[k++] = arraySort[i++];
}
else
{
tempArray[k++] = arraySort[j++];
}
} while (i <= midIndex)
{
tempArray[k++] = arraySort[i++];
}
while (j <= rightIndex)
{
tempArray[k++] = arraySort[j++];
} for (int i=; i<n1; ++i)
{
arraySort[leftIndex++] = tempArray[i];
}
tempIndex = midIndex+;
for (int i=; i<n2; ++i)
{
arraySort[tempIndex++] = tempArray[n1+i];
} delete []tempArray;
} template <typename Type>
void MergeSort(vector<Type> &arraySort, int leftIndex, int rightIndex)
{
if (leftIndex < rightIndex)
{
int midIndex = (leftIndex+rightIndex)/;
MergeSort(arraySort, leftIndex, midIndex);
MergeSort(arraySort, midIndex+, rightIndex);
Merge(arraySort, leftIndex, midIndex, rightIndex);
}
}
C/C++ 知识点---排序实现的更多相关文章
- JS的十大经典算法排序
引子 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements JavaScript. 当年,想凭借抱Java大腿火一把而不惜把自己名字给改了的JavaScript(原名LiveScript ...
- JS中常见排序算法详解
本文将详细介绍在JavaScript中算法的用法,配合动图生动形象的让你以最快的方法学习算法的原理以及在需求场景中的用途. 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements Java ...
- MySQL 基础语句
MySQL 基础语句 多个知识点 ----------------------------------------------------------------------------------- ...
- Perl小知识点之排序sort
脚本这种东西,就是要常用,否则一段时间不用就生疏了,因此决定时时记一些小知识点,一来回顾一下,二来需要的时候可以迅速获得提示. Sort by number You could now write a ...
- Acwing 1927 自动补全(知识点:hash,二分,排序)
读完题目第一想法是trie树 ,不过好像没怎么做过trie树的题,看y总给的知识点是二分排序,所以就有了如下思路: 但是但是,看完其他题解之后才坚定了我的想法,原来真的是这样排序,暴力啊! 具体步骤 ...
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...
- 一篇夯实一个知识点系列--python实现十大排序算法
写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...
- 【干货分享】前端面试知识点锦集02(CSS篇)——附答案
二.CSS部分 1.解释一下CSS的盒子模型? 回答一:a.标准的css盒子模型:宽度=内容的宽度+边框的宽度+加上内边具的宽度b.网页设计中常听的属性名:内容(content).填充(padding ...
- 【干货分享】前端面试知识点锦集01(HTML篇)——附答案
一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层分别是:HTML.CSS.JavaScript作用:HTML实现页面结构,CSS完成页面的表现与风格 ...
随机推荐
- NodeJS中的http模块
利用http模块,nodejs可以开发服务器, 极大简化服务器的创建: var http = require("http"); //创建服务器 var server = http. ...
- RabbitMQ系列教程之六:远程过程调用(RPC)
远程过程调用(Remote Proceddure call[RPC])(本实例都是使用的Net的客户端,使用C#编写) 在第二个教程中,我们学习了如何使用工作队列在多个工作实例之间分配耗时的任务. ...
- 第四章:Django 模型 —— 设计系统表
1. Django框架提供了完善的模型(Model )层来创建和存储数据,每一个模型对应数据库中的唯一的一张表. 2. Django 模型基础知识: .每一本模型是一个Python类,继承了djang ...
- 剖析touch事件在View中的传递
话不多说,直奔主题,先来看一张图 版权申明:这是csdn上别人的图,我觉得有用,就拿过来了, 然后简单说明下: 总的来说,触摸事件是从最外层的ViewGroup,一级一级传递进来的 和这相关的每个Vi ...
- 如何删除svn标签
SVN是Subversion的简称,是一个开放源代码的版本控制系统,对于多人共同开发同一个项目非常有用,但有一点比较让人头疼,那就是项目移植的时候,原来的文件夹带有很多可恶的svn标签,使其不能add ...
- Java并发编程(2):线程中断(含代码)
使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回.这 ...
- RxSwift 实战操作【注册登录】
前言 看了前面的文章,相信很多同学还不知道RxSwift该怎么使用,这篇文件将带领大家一起写一个 注册登录(ps:本例子采用MVVM)的例子进行实战.本篇文章是基于RxSwift3.0写的,采用的是C ...
- hash冲突随笔
一:hash表 也叫散列表,以key-value的形式存储数据,就是将需要存储的关键码值通过hash函数映射到表中的位置,可加快访问速度. 二:hash冲突 如果两个相同的关键码值通过hash函数映射 ...
- Android保存图片到本地相册
好久没有写东西了.备份下知识吧.免得忘记了 . 首先贴一段代码 -- 这个是先生成一个本地的路径,将图片保存到这个文件中,然后扫描下sd卡.让系统相册重新加载下 .缺点就是只能保存到DCIM的文 件 ...
- 实例甜点 Unreal Engine 4迷你教程(1)之如何用C++将纹理绘制在UserWidget的Image小部件上
完成本迷你教程之前,请前往完成以下迷你教程: 无前置教程待完成. 本教程适合的人群: 初学者,具有开发经验两周: 本示例的目的:为了在代码中实现UMG中的这个功能: 说明:这是一些列迷你教程的首篇,所 ...