#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. 【412】Linux 系统编译 C 程序

    1. 直接编译,会自动生成 a.out 文件,此文件即为可执行文件 # 编译 *.c 文件,生成可执行文件 a.out gcc euclide.c # 直接运行如下,如果没有输入和输出文件的话 # & ...

  2. TensorFlow博客翻译——用TensorFlow在云端进行机器学习

    https://github.com/tensorflow/tensorflow 原文地址 Machine Learning in the Cloud, with TensorFlow Wednesd ...

  3. HDU3092:Least common multiple(素数筛选+完全背包)

    题意 给出\(n\)和\(m\),将\(n\)拆成任意个数,求它们的最大的\(lcm\) 分析 1.可以证明\(n=p1^{s1}*p2^{s2}*...*pn^{sn}\)时\(lcm\)最大(其中 ...

  4. 51nod 1190 最小公倍数之和 V2【莫比乌斯反演】

    参考:http://blog.csdn.net/u014610830/article/details/49493279 这道题做起来感觉非常奇怪啊--头一次见把mu推出来再推没了的-- \[ \sum ...

  5. js 几秒之后就不断的执行

     function url()    { $.ajax({            url: "AA.ashx",            data: { ID: "gggg ...

  6. python中threading模块中最重要的Tread类

    Tread是threading模块中的重要类之一,可以使用它来创造线程.其具体使用方法是创建一个threading.Tread对象,在它的初始化函数中将需要调用的对象作为初始化参数传入. 具体代码如下 ...

  7. 理解C++中拷贝构造函数

    拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同样对象,是一种特殊的构造函数,具有一般构造函数的所有特性,当创建一个新对象的时候系统会自动调用它:其形参是本类对象的引用,它的特殊功能是将参数 ...

  8. git 标签

    如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签. 比如说,我们想为我们的 runoob 项目发布一个"1.0"版本. 我们可以 ...

  9. 题解报告:hdu 1263 水果

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1263 Problem Description 夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营 ...

  10. NSoup获取网页源代码

    NSoup是JSoup的Net移植版本.使用方法基本一致. 如果项目涉及HTML的处理,强烈推荐NSoup,毕竟字符串截断太苦逼了. 下载地址:http://nsoup.codeplex.com/ # ...