#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++实现的更多相关文章

  1. C#排序算法小结

    前言 算法这个东西其实在开发中很少用到,特别是web开发中,但是算法也很重要,因为任何的程序,任何的软件,都是由很多的算法和数据结构组成的.但是这不意味着算法对于每个软件设计人员的实际工作都是很重要的 ...

  2. 【C++】排序算法小结

    1.计数排序 如果给定上下界,并且区间不大的话,最适用. 比如对于英文字母数组进行排序. 时间复杂度O(n),空间复杂度O(n) void countSort(int A[], int n, int ...

  3. C#排序算法

    随笔- 41  文章- 0  评论- 25  C#排序算法小结   前言 算法这个东西其实在开发中很少用到,特别是web开发中,但是算法也很重要,因为任何的程序,任何的软件,都是由很多的算法和数据结构 ...

  4. 剑指Offer--排序算法小结

    剑指Offer--排序算法小结 前言 毕业季转眼即到,工作成为毕业季的头等大事,必须得认认真真进行知识储备,迎战笔试.电面.面试. 许久未接触排序算法了.平时偶尔接触到时自己会不假思索的百度,然后就是 ...

  5. 【路飞学城Day170】算法小结

    Evernote Export 算法的思想是能省则省,内存能少则少,时间运行能少尽量少 堆排序的时间复杂度O(nlogn) 堆排序的内置模块heapq 常用函数 heapify(x) heappush ...

  6. 贝叶斯个性化排序(BPR)算法小结

    在矩阵分解在协同过滤推荐算法中的应用中,我们讨论过像funkSVD之类的矩阵分解方法如何用于推荐.今天我们讲另一种在实际产品中用的比较多的推荐算法:贝叶斯个性化排序(Bayesian Personal ...

  7. 用HTML5实现的各种排序算法的动画比较 及算法小结

    用HTML5实现的各种排序算法的动画比较 http://www.webhek.com/misc/comparison-sort/ 几种排序算法效率的比较 来源:http://blog.chinauni ...

  8. 第23章 排序算法(包括merge等)

      第23章 排序算法  Sorting:1 sort Sort elements in range (function template)2 stable_sort Sort elements pr ...

  9. 常见排序算法基于JS的实现

    一:冒泡排序 1. 原理 a. 从头开始比较相邻的两个待排序元素,如果前面元素大于后面元素,就将二个元素位置互换 b. 这样对序列的第0个元素到n-1个元素进行一次遍历后,最大的一个元素就“沉”到序列 ...

随机推荐

  1. bzoj 3105: [cqoi2013]新Nim游戏【线性基+贪心】

    nim游戏的先手必胜条件是所有堆的火柴个数异或和为0,也就是找一个剩下火柴堆数没有异或和为0的子集的方案,且这个方案保证剩下的火柴个数总和最大 然后我就不会了,其实我到现在也不知道拟阵是个什么玩意-- ...

  2. 【API】反转输入字符(Java)

    请求输入字符, 输出反转. import java.util.Scanner; public class T01 { public static void main(String[] args) { ...

  3. apicloud踩坑集锦

    最近在用apicloud开发,这里录入一些踩坑的地方,从头到尾,要多尴尬有多尴尬,新入app开发,记录一些心得,和遇到的坑以及解决办法. 1,apicloud 打包的Android app ,打开fr ...

  4. mqtt遇到的问题锦集

    1.无效客户机标识 (2) Connect指令中的KeepAlive有效范围[60秒,300秒],否则会拒绝连接. 2.消息回调出现频繁的断开连接 待解决 3.长时间消息回调出现 已断开连接 (321 ...

  5. 数据结构 - 顺序队列的实行(C语言)

    数据结构-顺序队列的实现 1 顺序队列的定义 线性表有顺序存储和链式存储,队列作为一种特殊的线性表,也同样存在这两种存储方式.我们先来看队列的顺序存储结构. 队列的顺序储存结构:用数组存储队列,为了避 ...

  6. [Usaco2006 Open]The Climbing Wall 攀岩

    Description One of the most popular attractions at the county fair is the climbing wall. Bessie want ...

  7. dubbo服务端响应超时错误一例记录

    错误描述: Portlet J2AppsPortlet::QuickStartPortlet not available: Waiting server-side response timeout. ...

  8. android:fillViewport="true"让ScrollView内的view强行match_parent

    当你想让一个高度值不足scrollview的子控件fillparent的时候,单独的定义android:layout_height="fill_parent"是不起作用的,必须加上 ...

  9. SimpleDateForma类

    package Format_daqo; import java.text.SimpleDateFormat; import java.util.Date; public class SimpleDa ...

  10. 配置Oracle网络服务

    Oracle网络服务是什么呢? Oracle网络服务是客户端访问数据库服务器端才需要配置的,也就是说,你的Oracle数据库没有装在你自己的电脑上,你需要去访问别人电脑上的Oracle数据库,那么你就 ...