排序算法C++11实现——冒泡、选择、插入、希尔、堆、合并、快速排序(非递归)
来源:互联网 发布:苹果手机快速打开数据 编辑:程序博客网 时间:2024/05/19 17:49
Makefile
g++ -std=c++11 -o sort sort.cpp
代码
sort.cpp
#include <vector>#include <climits>#include <cassert>#include <algorithm>#include <array>#include <stack>
void bubbleSort(std::vector<int> &v){ std::size_t vsize = v.size(); assert(vsize <= INT_MAX); int size = static_cast<int>(vsize); bool hasSwap = true; for (int i = 0; (i < size-1) && hasSwap; ++i) { for (int j = size-1; j > i; --j) { if (v[j] < v[j-1]) { std::swap(v[j], v[j-1]); hasSwap = true; } } }}
void selectSort(std::vector<int> &v){ std::size_t vsize = v.size(); assert(vsize <= INT_MAX); int size = static_cast<int>(vsize); for (int i = 0; i < size-1; ++i) { int min = i; for (int j = i+1; j < size; ++j) { if (v[min] > v[j]) { min = j; } } if (min != i) { std::swap(v[min], v[i]); } }}
void insertSort(std::vector<int> &v){ std::size_t vsize = v.size(); assert(vsize <= INT_MAX); int size = static_cast<int>(vsize); for (int i = 0; i < size-1; ++i) { if (v[i+1] < v[i]) { int j = i; int temp = v[j+1]; for (; (j >= 0) && (temp < v[j]); --j) { v[j+1] = v[j]; } v[j+1] = temp; } }}
void shellSort(std::vector<int> &v){ std::size_t vsize = v.size(); assert(vsize <= INT_MAX); int size = static_cast<int>(vsize); int step = size; do { step = step/3 + 1; for (int i = 0; i < size-step; ++i) { if (v[i+step] < v[i]) { int j = i; int temp = v[j+step]; for (; (j >= 0) && (temp < v[j]); j -= step) { v[j+step] = v[j]; } v[j+step] = temp; } } } while (step > 1);}
void heapAdjust(std::vector<int> &v, int node, int end){ std::size_t vsize = v.size(); assert(vsize <= INT_MAX); int size = static_cast<int>(vsize); assert(node < end && end <= size); while (node < end) { int right = (node+1) << 1; int left = right - 1; if (left >= end) { return; } int max = left; if ((right < end) && (v[right] > v[left])) { max = right; } if (v[node] >= v[max]) { return; } std::swap(v[node], v[max]); node = max; }}void heapSort(std::vector<int> &v){ std::size_t vsize = v.size(); assert(vsize <= INT_MAX); int size = static_cast<int>(vsize); for (int i = (size>>1)-1; i >= 0; --i) { heapAdjust(v, i, size); } for (int i = size-1; i > 0; --i) { std::swap(v[0], v[i]); heapAdjust(v, 0, i); }}
void merge(std::vector<int> &v, std::vector<int> &vb, int begin, int middle, int end){ std::size_t vsize = v.size(); assert(vsize == vb.size()); assert(vsize <= INT_MAX); int size = static_cast<int>(vsize); assert((begin < middle) && (middle <= end) && (end <= size)); int i = begin, m = begin, n = middle; while (m < middle && n < end) { vb[i++] = v[m] < v[n] ? v[m++] : v[n++]; } while (m < middle) { vb[i++] = v[m++]; } while (n < end) { vb[i++] = v[n++]; }}void mergeSort(std::vector<int> &v){ std::size_t vsize = v.size(); assert(vsize <= INT_MAX); int size = static_cast<int>(vsize); std::vector<int> vb(size, 0); for (int step = 1; step < size; step<<=1) { for (int i = 0; i < size; i+=step) { int begin = i; int middle = begin + step; int end = middle + step; merge(v, vb, begin, std::min(middle,size), std::min(end,size)); } std::copy(vb.begin(), vb.end(), v.begin()); }}
int partition(std::vector<int>&v, int begin, int end){ std::array<int, 3> array{begin, end, begin+((end-begin)>>1)}; std::sort(array.begin(), array.end(), [&v](int x,int y){return v[x] < v[y];}); std::swap(v[array[1]], v[begin]); int temp = v[begin]; while (begin < end) { while (begin < end && v[end] >= temp) { --end; } v[begin] = v[end]; while (begin < end && v[begin] <= temp) { ++begin; } v[end] = v[begin]; } v[begin] = temp; return begin;}void quickSort(std::vector<int> &v){ std::size_t vsize = v.size(); assert(vsize <= INT_MAX); int size = static_cast<int>(vsize); std::stack<std::pair<int, int>> s; if (size > 1) { s.push({0, size-1}); } while (!s.empty()) { auto pair = s.top(); s.pop(); auto middle = partition(v, pair.first, pair.second); if (pair.first < middle - 1) { s.push({pair.first, middle-1}); } if (middle + 1 < pair.second) { s.push({middle+1, pair.second}); } }}
#include <iterator>#include <iostream>int main(){ std::vector<int> v; v.assign({2,8,10,3,12,9,5,11,0,6,4,13,1,7}); std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl << "bubble: "; bubbleSort(v); std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl << "select: "; selectSort(v); std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl << "insert: "; insertSort(v); std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl << "shell: "; shellSort(v); std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl << "heap: "; heapSort(v); std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl << "merge: "; mergeSort(v); std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl << "quick: "; quickSort(v); std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; return 0;}
结果
2 8 10 3 12 9 5 11 0 6 4 13 1 7 bubble: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 select: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 insert: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 shell: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 heap: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 merge: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 quick: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
阅读全文
0 0
- 排序算法C++11实现——冒泡、选择、插入、希尔、堆、合并、快速排序(非递归)
- 七大排序算法(冒泡,选择,插入,二分法排序,希尔,快速,合并,堆排序)的java实现
- 七大排序算法(冒泡,选择,插入,二分法排序,希尔,快速,合并,堆排序)的java实现(14/8/3更新加入二分排序)
- 各种排序算法实现——基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- C语言常用排序——直接插入,冒泡,选择,希尔,快速,堆排序
- 排序算法----冒泡排序+插入排序+选择排序+快速排序+希尔排序+堆排序+归并排序+计数排序+基数排序+桶排序(c语言)
- 数组排序 —— 常用基础数组排序算法(冒泡、选择、插入、归并、快速、堆、希尔、计数、基数排序)
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- C 各种排序(选择/冒泡/快速/插入/希尔/归并/堆)
- 各种排序算法的稳定性(冒泡、选择、插入、快速、堆排序、希尔排序等)
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- 冒泡排序,选择排序,插入排序,希尔排序,合并排序,快速排序算法
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- 排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序,堆排序)
- 排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序,堆排序)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- c语言排序算法(所有的都是升序,冒泡排序、插入排序、快速排序、选择排序、希尔排序、堆排序 )
- 网络结构 googlenet
- Python3 正则表达式特殊符号及用法(详细列表)
- 数据结构知识点总结
- 【代码练习7】UPD协议传输练习
- Java设计模式之职责链模式
- 排序算法C++11实现——冒泡、选择、插入、希尔、堆、合并、快速排序(非递归)
- java相关属性转json的相关注解
- 将qt help移植到arm(xilinx)-linux
- 拉格朗日乘子法与对偶问题
- 【译】ArcGIS Runtime SDK 100.2.0的新增功能
- [转]Java图形化界面设计——布局管理器之BorderLayout(边界布局)
- 大数据学习笔记(十三)-Hive高级
- hdu 1455 sticks (dfs+枝剪)
- 正则学习完美一篇