各种排序算法C++
各种排序算法


插入排序
直接插入排序
void InsertSort(int arr[], int len) {
int i, j;
int temp;
for (i = 1; i < len; i++) {
temp = arr[i];
for (j = i - 1; j >= 0 && arr[j] > temp; j--)
arr[j + 1] = arr[j];
arr[j + 1] = temp;
}
}
插入排序的时间复杂度最好的情况是已经是正序的序列,只需比较(n−1)次,时间复杂度为O(n),最坏的情况是倒序的序列,要比较n(n−1)2次,时间复杂度为O(n2),平均的话要比较时间复杂度为O(n2).

shell(希尔)排序
int* shellSort(int* A, int n) {
int step = n/3;
while (step>0) {
if(step == 2)
step = 1;
for (int i=step; i<n; ++i) {
int j = i;
while (j-step>=0 && A[j-step] > A[j]) {
swap(A[j-step], A[j]);
j -=step;
}
}
step /= 3;
}
return A;
}
选择排序
直接选择排序
void selectSort(int* arr, int len){
for (int i = 0; i<len; i++) {
int min = i;
for (int j = i; j<len; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
swap(arr[i], arr[min]);
}
}
堆排序
//堆调整
void HeapAdjust(int arr[], int first, int end){
int father = first;
int son = father * 2 + 1;
while (son < end) {
if (son + 1 < end && arr[son] < arr[son+1])
++son;
if (arr[father] > arr[son])
break;//如果父节点大于子节点则表示调整完毕
else {
swap(arr[father], arr[son]); //不然就交换父节点和子节点的元素
father = son; //父和子节点变成下一个要比较的位置
son = 2 * father + 1;
}
}
}
//堆排序
void HeapSort(int arr[], int len) {
int i;
for (i = len/2 - 1; i >= 0; --i) {
HeapAdjust(arr, i, len); //初始化堆,从最后一个父节点开始
}
for (i = len - 1; i > 0; --i) {
swap(arr[0], arr[i]); //从堆中的取出最大的元素再调整堆
HeapAdjust(arr, 0, i); //调整成堆
}
}
堆排序的时间复杂度最好到最坏都是O(nlogn),较多元素的时候效率比较高
交换排序
冒泡排序
void bubbleSort(int arr[],int len) {
for (int i = 0; i<len; i++) {
for (int j = 1; j<len-i; j++) {
if (arr[j-1] > arr[j]) {
swap(arr[j-1], arr[j]);
}
}
}
}
void bubbleSort2(int arr[],int len) {
for (int i = 0; i<len; i++) {
int flag = 0;
for (int j = 1; j<len-i; j++) {
if (arr[j-1] > arr[j]) {
flag = 1;
swap(arr[j-1], arr[j]);
}
}
if (!flag) break;
}
}
快速排序
int Partition(int arr[], int first, int last) {
int tmp = arr[last];
while (first < last) {
while (first < last && arr[first] <= tmp)
first++;
swap(arr[first], arr[last]);
while (first < last && arr[last] >= tmp)
last--;
swap(arr[first], arr[last]);
}
return first;
}
void quickSortPart(int arr[], int first, int last) {
if (first >= last) return;
int mid = Partition(arr, first, last);
quickSortPart(arr, first, mid - 1);
quickSortPart(arr, mid + 1, last);
}
void quickSort(int arr[],int len) {
quickSortPart(arr, 0, len-1);
}

归并排序


void merge(int arr[], int tmp[], int first, int mid, int last) {
int i = first;
int j = mid+1;
int k = first;
while (i<=mid && j<=last) {
if (arr[i] < arr[j]) {
tmp[k++] = arr[i++];
}
else{
tmp[k++] = arr[j++];
}
}
while (i<=mid) {
tmp[k++] = arr[i++];
}
while (j<=last) {
tmp[k++] = arr[j++];
}
for (i = first; i<=last; i++) {
arr[i] = tmp[i];
}
}
void mergeSortPart(int arr[], int tmp[], int first, int last) {
if (first >= last) return;
int mid = first + (last -first) / 2;
mergeSortPart(arr, tmp, first, mid);
mergeSortPart(arr, tmp, mid+1, last);
merge(arr, tmp, first, mid, last);
}
void mergeSort(int arr[],int len) {
int *tmp = new int[len];
mergeSortPart(arr, tmp, 0, len - 1);
delete [] tmp;
}
桶排序
计数排序
基数排序
各种排序算法C++的更多相关文章
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 几大排序算法的Java实现
很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...
- 排序算法----基数排序(RadixSort(L,max))单链表版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 排序算法汇总(C/C++实现)
前言: 本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...
- 用Java来写常见的排序算法
随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...
- 模板化的七种排序算法,适用于T* vector<T>以及list<T>
最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...
- 排序算法总结第二弹----冒泡排序---javascript描述
上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...
- 排序算法总结------选择排序 ---javascript描述
每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...
随机推荐
- Delphi Delay 延时计数的功能。 下面的方法都是思路,但是没有用在项目上
procedure Tfrm_InstrumentControl.aa;var CurLength: Word; vTimeLength: Word;begin Screen.Cursor := cr ...
- 【docker】查看docker容器或镜像的详细信息命令,查看docker中正在运行的容器的挂载位置
命令: docker inspect f257d69e0035 格式: docker inspect 容积或镜像ID 首先,docker ps获取简要信息 然后输入命令docker inspect ...
- 【FTP】java FTPClient 文件上传内容为空,文件大小为0
问题:如题所述,使用FTPClient上传至FTP服务器, 表现如下:①文件大小为0 ②上传很小的文件,但是要花费很长的时间,20K要花费2分钟甚至更久 ③没有任何的报错,没有任何的乱码 解决方法: ...
- Gitlab系列八之重置管理员密码
gitlab web登入密码忘记以后可以用如下方式修改密码 [root@gitlat-test gitlab]# gitlab-rails console production Loading pro ...
- VR开发者必看:4大最为值得关注的内容平台【转】
时间 2016-01-19 14:12:57 原文 http://www.sfw.cn/xinwen/478369.html 主题 虚拟现实 Oculus 对很多有意涉及VR行业的内 ...
- 面试题:判断两个字符串是否互为回环变位(Circular Rotaion)
题干: 如果字符串 s 中的字符循环移动任意位置之后能够得到另一个字符串 t,那么 s 就被称为 t 的回环变位(circular rotation). 例如,ACTGACG 就是 TGACG ...
- D3.js系列——动态效果和Update、Enter、Exit的理解
一.动态效果 D3 支持制作动态的图表.有时候,图表的变化需要缓慢的发生,以便于让用户看清楚变化的过程,也能给用户不小的友好感. 1.什么是动态效果 前面制作的图表是一蹴而就地出现,然后绘制完成后不再 ...
- android应用开发-从设计到实现 2-8 组件与经常使用模式
组件与经常使用模式 前面已经比較全面的介绍了Material Design相关的设计哲学.设计原理和方法论. 这一章開始,我们将看看这些原理是怎样在安卓系统其中得到实践的. 一个应用并非全然从什么都没 ...
- linux的chmod命令
chmod命令用来变更文件或目录的权限.在UNIX系统家族里,文件或目录权限的控制分别以读取.写入.执行3种一般权限来区分,另有3种特殊权限可供运用.用户可以使用chmod指令去变更文件与目录的权限, ...
- 通过ssh上传文件到目标主机
需要通过ssh上传文件到目标主机上,之前一直时通过ssh客户端来传文件的,这次因为本地没装客户端,所以考虑直接用终端通过ssh连接主机进行文件传输. 只需要一条命令就可以了: scp ./serve ...
