#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. 《10 minutes to pandas》(转)

    原文出处:http://pandas.pydata.org/pandas-docs/stable/10min.html 10 Minutes to pandas This is a short int ...

  2. bzoj 4596

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 257  Solved: 152[Submit][Sta ...

  3. redis info 参数说明

    原文: redis info 参数说明 redis 127.0.0.1:6381> info redis_version:2.4.16 # Redis 的版本redis_git_sha1:000 ...

  4. ChartCtrl源码剖析之——CChartScrollBar类

    CChartScrollBar类用来针对每个轴的数据进行滚动,将那些不在当前区域内的数据通过滚动展示出来. CChartScrollBar类的头文件. #pragma once class CChar ...

  5. 关于zookeeper的集群搭建

    在所有机器上安装完zookeeper之后, 开始进行集群的搭建 1. 修改 ../zookeeper/conf/zoo.cfg 文件 tickTime=2000 dataDir=/usr/local/ ...

  6. EF7学习资料整理

    EntityFramework 7 开发纪录 http://www.cnblogs.com/xishuai/archive/2014/11/28/ef7-develop-note.html Entit ...

  7. silverlight 子UserControl获取父UserControl

    文章转载自: [Silverlight] Silverlight中访问父对象 http://bbs.blueidea.com/thread-2964806-1-1.html 当前一个需求是一个User ...

  8. linux下解压tgz文件(转载)

    转自:http://www.blogjava.net/chenlb/archive/2008/09/03/226654.html .tgz 解压:    tar zxvf myfile.tgz

  9. Git学习三

    一.准备Github远程仓库 1.github官网注册账户 2.ubuntu端创建SSH Key $ssh-keygen -t rsa -C "youremail@example.com&q ...

  10. hdu 5201 The Monkey King【容斥原理+组合数学】

    原来我一开始以为的\( O(n^2) \)是调和级数\( O(nlog_2n) \)的! 首先枚举猴王的桃子个数\( x \),然后使用容斥原理,枚举有至少\( k \)个不满足的条件,那么这\( k ...