排序算法小结:C++实现
#include<vector>
#include<iostream> //排序算法的稳定性:对于相同的关键字,排序之前的位置和排序之后的位置相同,则称为稳定排序,否则不稳定排序。 //归并排序:基本思想为:先分解再合并,在合并的过程中进行排序;
//稳定排序;平均时间复杂度为:O(nlogn); 最好时间复杂度O(nlogn);最好时间复杂度O(nlogn);空间复杂度O(n);
void Meger(std::vector<int> &data, int begin, int mid,int end) {
if (begin == end) {
return;
} int length = end - begin+; std::vector<int> temp(length); int i = begin;
int j = mid+;
int k = ;
while (i <= mid&&j <= end) {
if (data[i] <= data[j]) {
temp[k++] = data[i++];
}
else {
temp[k++] = data[j++];
}
} while (i <= mid) {
temp[k++] = data[i++];
} while (j <= end) {
temp[k++] = data[j++];
} for (i = ; i < k; i++) {
data[begin + i] = temp[i];
}
} void Divide(std::vector<int> &data, int begin, int end) { if (begin>=end) {
return;
} int mid = (begin + end) / ; Divide(data, begin, mid);
Divide(data, mid+, end); Meger(data, begin,mid, end);
} void Meger_Sort(std::vector<int> &data) {
if (data.empty()) {
return;
} Divide(data, , data.size()-); for (auto each : data) {
std::cout << each << "\n";
}
} //Quick Sort: 找到中间分割点,根据中间分割点进行排序,再递归。
//不稳定;平均时间复杂度O(nlogn); 最好时间复杂度O(nlogn);最坏时间复杂度O(n^2);空间复杂度O(logn)
int Partition(std::vector<int> &vec, int left, int right) {
int X = vec[left];
while (left < right) {
while (vec[right] > X) {
right--;
}
if (left < right) {
vec[left] = vec[right];
left++;
} while (vec[left] <= X) {
left++;
}
if (left < right) {
vec[right] = vec[left];
right--;
}
}
vec[right] = X;
return right;
} void Quick_Sort(std::vector<int> &vec,int left,int right) {
if (vec.empty()) {
return;
} if (left < right) {
int p = Partition(vec, left, right);
Quick_Sort(vec, left, p - );
Quick_Sort(vec, p + , right);
}
} //选择排序
//不稳定;平均时间复杂度O(n^2); 最好时间复杂度O(n^2);最坏时间复杂度O(n^2);空间复杂度O(1)
void Select_Sort(std::vector<int> &vec) {
for (int i = ; i < vec.size()-; i++) {
int mini_index = i;
for (int j = i+; j < vec.size(); j++) {
if (vec[j] < vec[mini_index]) {
mini_index = j;
}
}
std::swap(vec[i], vec[mini_index]);
}
} //冒泡排序
//稳定;平均时间复杂度O(n^2); 最好时间复杂度O(n);最坏时间复杂度O(n^2);空间复杂度O(1)
void Bubble_Sort(std::vector<int> &vec) {
//普通版本;
for (int i = ; i < vec.size(); ++i) {
for (int j = ; j < vec.size() - i; ++j) {
if (vec[j-] > vec[j]) {
std::swap(vec[j-], vec[j]);
}
}
}
} void fast_Bubble_Sort(std::vector<int> &vec) {
//fast 版本;
int flag = vec.size();
int len = flag;
while (flag) {
flag = ;
for (int i = ; i < len; ++i) {
if (vec[i - ] > vec[i]) {
std::swap(vec[i - ], vec[i]);
}
flag = i;
}
len = flag;
} } //插入排序
//稳定;平均时间复杂度O(n^2); 最好时间复杂度O(n);最坏时间复杂度O(n^2);空间复杂度O(1)
void Insert_Sort(std::vector<int> &vec) {
for (int i = ; i < vec.size(); ++i) {
int temp = vec.at(i);
int j = i - ;
while (j >= &&vec.at(j) > temp) {
vec[j + ] = vec[j];
j--;
}
vec[j+] = temp;
}
} //堆排序:先建立一个大根堆,然后将堆顶元素和队列尾的元素进行交换,这样就等于大元素放到队尾了每次交换,
// 需要对堆进行调整。
//不稳定;平均时间复杂度O(nlogn); 最好时间复杂度O(nlogn);最坏时间复杂度O(nlogn);空间复杂度O(1)
void adjustHeap(std::vector<int> &vec, int index,int length) { int temp = vec[index]; //首先将该元素与其左子节点元素进行比较
for (int k = * index + ; k < length; k = * k + ) { //对左右节点进行比较,如果右节点比较大,更换成右节点
if (k + < length&&vec[k] < vec[k + ]) {
k++;
} if (vec[k] >temp) {
vec[index] = vec[k];
index = k;
}
else
{
break;
}
} vec[index] = temp;
} void HeapSort(std::vector<int> &vec) { int length = vec.size();
if (length == ) {
return;
} //构建最大堆;
for (int i = length / - ; i >= ; i--) {
adjustHeap(vec, i, length);
} //大堆顶元素逐个与末尾元素进行交换。
for (int i = length - ; i > ; i--) {
std::swap(vec[i], vec[]);
adjustHeap(vec, ,i);
}
} //Main 函数测试部门;
int main() { std::vector<int> vec = { ,,,,,,,,,,,, };
HeapSort(vec);
for (auto each : vec) {
std::cout << each << "\n";
}
return ;
}
排序算法小结:C++实现的更多相关文章
- C#排序算法小结
前言 算法这个东西其实在开发中很少用到,特别是web开发中,但是算法也很重要,因为任何的程序,任何的软件,都是由很多的算法和数据结构组成的.但是这不意味着算法对于每个软件设计人员的实际工作都是很重要的 ...
- 【C++】排序算法小结
1.计数排序 如果给定上下界,并且区间不大的话,最适用. 比如对于英文字母数组进行排序. 时间复杂度O(n),空间复杂度O(n) void countSort(int A[], int n, int ...
- C#排序算法
随笔- 41 文章- 0 评论- 25 C#排序算法小结 前言 算法这个东西其实在开发中很少用到,特别是web开发中,但是算法也很重要,因为任何的程序,任何的软件,都是由很多的算法和数据结构 ...
- 剑指Offer--排序算法小结
剑指Offer--排序算法小结 前言 毕业季转眼即到,工作成为毕业季的头等大事,必须得认认真真进行知识储备,迎战笔试.电面.面试. 许久未接触排序算法了.平时偶尔接触到时自己会不假思索的百度,然后就是 ...
- 【路飞学城Day170】算法小结
Evernote Export 算法的思想是能省则省,内存能少则少,时间运行能少尽量少 堆排序的时间复杂度O(nlogn) 堆排序的内置模块heapq 常用函数 heapify(x) heappush ...
- 贝叶斯个性化排序(BPR)算法小结
在矩阵分解在协同过滤推荐算法中的应用中,我们讨论过像funkSVD之类的矩阵分解方法如何用于推荐.今天我们讲另一种在实际产品中用的比较多的推荐算法:贝叶斯个性化排序(Bayesian Personal ...
- 用HTML5实现的各种排序算法的动画比较 及算法小结
用HTML5实现的各种排序算法的动画比较 http://www.webhek.com/misc/comparison-sort/ 几种排序算法效率的比较 来源:http://blog.chinauni ...
- 第23章 排序算法(包括merge等)
第23章 排序算法 Sorting:1 sort Sort elements in range (function template)2 stable_sort Sort elements pr ...
- 常见排序算法基于JS的实现
一:冒泡排序 1. 原理 a. 从头开始比较相邻的两个待排序元素,如果前面元素大于后面元素,就将二个元素位置互换 b. 这样对序列的第0个元素到n-1个元素进行一次遍历后,最大的一个元素就“沉”到序列 ...
随机推荐
- Python sklearn Adaboost
1. Adaboost类库概述 scikit-learn中Adaboost类库比较直接,就是AdaBoostClassifier和AdaBoostRegressor两个,从名字就可以看出AdaBoos ...
- 项目迁移腾讯云后,用户反馈,https证书不匹配。
腾讯云大禹高防大禹BGP同一IP绑定多个证书,用户反馈无法匹配我们域名对应证书.但是浏览器是支持的.定位为客户端不支持sni在运维检查lb及高防证书关联无误,定位发现是用户端httpclient没有设 ...
- bzoj 1079: [SCOI2008]着色方案【记忆化搜索】
本来打算把每个颜色剩下的压起来存map来记忆化,写一半发现自己zz了 考虑当前都能涂x次的油漆本质是一样的. 直接存五个变量分别是剩下12345个格子的油漆数,然后直接开数组把这个和步数存起来,记忆化 ...
- Activiti6.0教程 Service用途剖析 (二)
这节我们学习下Activiti的7大对象,首先我们从ProcessEngine接口开始看. /* Licensed under the Apache License, Version 2.0 (the ...
- Unix\Linux | 总结笔记 |文件系统
1. ls [选项] [文件] 显示目录中的文件信息 -a 显示全部文件(包括隐藏文件) -l 查看文件的属性.大小等详细信息 (ls -l 详解) -al 查看当前目录中 ...
- poj 3295 Tautology 伪递归
题目链接: http://poj.org/problem?id=3295 题目描述: 给一个字符串,字符串所表示的表达式中p, q, r, s, t表示变量,取值可以为1或0.K, A, N, C, ...
- iOS开发系列--通知与消息机制--转
来自:http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户 ...
- iOS 实现复选框 checkbox --转
转自:http://www.cnblogs.com/ygm900/p/3468891.html -(void)checkboxClick:(UIButton *)btn{ btn.select ...
- windows deintall 12c client
1.unintall: close all oracle app C:\app\client\CICadmin\product\12.1.0\client_1\deinstall deinstall ...
- 213 House Robber II 打家劫舍 II
注意事项: 这是 打家劫舍 的延伸.在上次盗窃完一条街道之后,窃贼又转到了一个新的地方,这样他就不会引起太多注意.这一次,这个地方的所有房屋都围成一圈.这意味着第一个房子是最后一个是紧挨着的.同时,这 ...