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完成页面的表现与风格 ...
随机推荐
- maven(二) maven项目构建ssh工程(父工程与子模块的拆分与聚合)
前一节我们明白了maven是个什么玩意,这一节就来讲讲他的一个重要的应用场景,也就是通过maven将一个ssh项目分割为不同的几个部分独立开发,很重要,加油 --WH 一.maven父工程与子模块的拆 ...
- Linux下安装openvpn
工作上常常要通过vpn访问内网环境,最近一直在linux上搞东西,为了方便起见在linux上也安装了openvpn. 本次安装的openvpn不是把它当做服务端,而仅仅是以客户端来使用,所以没有那些服 ...
- ReadTeacherObj
package JBJADV003;import java.io.*;public class ReadTeacherObj { /** * @param args */ public static ...
- 记一次SAP新业务开发项目
直到笔者写这篇博文的时候,这个开发项目名义上已经上线,但其实开发以及优化的工作还在继续,数据的修复也仍在继续... IT系统环境很简单,一个基于JAVA+Mysql的Web平台,一个是宇宙第一的SAP ...
- 测试框架:使用SONAR分析代码质量
介绍 Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质量.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具,比如pmd-cpd.checkstyl ...
- 爬取拉勾部分求职信息+Bootstrap页面显示
今天在用python实现爬虫的时候,就想看一下用c#实现同样的功能到底会多出来多少code,结果写着写着干脆把页面也简单的写一个出来,方便调试, 大致流程如下: 1.分析拉勾数据 2.查找拉勾做了哪些 ...
- js实现存储对象的数据结构hashTable和list
以下代码是typescript语言来写的,其实和es6面向对象的写法基本一致.大家阅读后都明白这些方法的作用. hash hash结构用于处理和表现类似key/value的键值对,其中key通常可用来 ...
- nyoj_68:三点顺序(计算几何)
题目链接 根据 AB*AC的值进行判断即可(ps,结果为0时不构成三角形) #include<iostream> #include<cstdio> #include<cs ...
- zTree学习实例
今天做完一个zTree的实例,供有需要的学习! 效果图如下:
- KMP算法 --- 在文本中寻找目标字符串
KMP算法 --- 在文本中寻找目标字符串 很多时候,为了在大文本中寻找到自己需要的内容,往往需要搜索关键字.这其中就牵涉到字符串匹配的算法,通过接受文本和关键词参数来返回关键词在文本出现的位置.一般 ...