排序算法小结: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个元素进行一次遍历后,最大的一个元素就“沉”到序列 ...
随机推荐
- patch用法 (转载)
转载:http://shenze60.blog.163.com/blog/static/315747722009724113026896/ 首先介绍一下diff和patch.在这里不会把man在线文档 ...
- sql sever使用sql语句查询数据, 分割某字段改为多行,其它字段保持不变
如表中有A.B.C三个字段,数据如下: A B C 1,2 3 4 要求查询结果: A B C 1 3 ...
- 51nod 1244 莫比乌斯函数之和 【莫比乌斯函数+杜教筛】
和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\mu(i) \ ...
- 51nod 1238 最小公倍数之和 V3 【欧拉函数+杜教筛】
首先题目中给出的代码打错了,少了个等于号,应该是 G=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) { G = (G + lcm(i,j)) % 10000 ...
- 组合数学练习题(一)——Chemist
题意: 从 n 个人中选出不超过 k 个人,再在选出的人中选出一些人成为队员,再在队员中选一名队长,求不同的方案数.答案 mod 8388608. 共有T组询问,每次给你n和k.T ≤ 10^4 k ...
- 2017 ACM-ICPC Asia East Final T1
好弱啊只会T1,在Chemist&&wxh两位dalao的指导下搞懂. 题解如下.[手写版本 滑稽 code #include<bits/stdc++.h> using n ...
- SpringMVC Model,ModelMap ModelAndView
SpringMVC 调用方法之前会创一个隐含的模型对象(即Model,ModelMap ModelAndView) //@ModelAttribute 先于login方法执行 @ModelAttrib ...
- 《Windows核心编程系列》十谈谈同步设备IO与异步设备IO之异步IO
同步设备IO与异步设备IO之异步IO介绍 设备IO与cpu速度甚至是内存访问相比较都是比较慢的,而且更不可预测.虽然如此,通过使用异步设备IO我们仍然能够创造出更高效的程序. 同步IO时,发出IO请求 ...
- Selenium定位多个iframe嵌套中的元素
在公司boss系统中,经常会遇到多层iframe嵌套的情况,导致无法定位最里面那层iframe的元素. 其实很简单,只要一层层定位iframe,定位到你想要的那层iframe即可: 如果操作完需要返回 ...
- 写给W小姐的一封信
生活 琐碎 Hallo,Preaty.对于跟人说话,我很不擅长如何开头.我不知道什么样的开头是符合我在别人心目中我应有的形象.我不知道什么样的开头符合别人预想中与我相匹配的内容.或者说什么的开头才是一 ...