常用排序算法分析(C++实现)
来源:互联网 发布:java平台搭建 编辑:程序博客网 时间:2024/05/23 13:51
这篇文章把常用的七个排序算法都实现了一遍,同时分析了各个算法的特点。
排序分类:
内部排序和外部排序:
- 若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。
- 在内部排序中,根据排序过程中所依据的原则可以将它们分为5类:插入排序、交换排序、选择排序、归并排序和基数排序;
稳定排序和不稳定排序:
- 假设在待排序的文件中,存在两个或两个以上的记录具有相同的关键字,在用某种排序法排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序方法是稳定的。
- 冒泡,插入,基数,归并 属于稳定排序
- 选择,快速,希尔,堆 属于不稳定排序。
就地排序:
- 若排序算法所需的辅助空间并不依赖于问题的规模n,即辅助空间为O(1),则称为就地排序。
归并排序和堆排序、快速排序的比较
若从空间复杂度来考虑:首选堆排序,其次是快速排序,最后是归并排序。
若从稳定性来考虑,应选取归并排序,因为堆排序和快速排序都是不稳定的。
若从平均情况下的排序速度考虑,应该选择快速排序。
#include <iostream>#include <vector>#include <ctime>#include <queue>using namespace std;/* Heap Sort */void heap_sort(vector<double>& a) {priority_queue<double, vector<double>, greater<double> > nums_heap;for(auto& r : a)nums_heap.push(r);int i = 0;while(!nums_heap.empty()) {a[i++] = nums_heap.top();nums_heap.pop();}}/* Merge Sort */void merge_array(vector<double>& a, long first, long mid, long last) {vector<double> temp_array;int i = first, u = mid; // first arrayint j = mid + 1, v = last; // second arrayint k = 0;while(i <= u && j <= v) {if(a[i] < a[j])temp_array.push_back(a[i++]);elsetemp_array.push_back(a[j++]);}while(i <= u)temp_array.push_back(a[i++]);while(j <= v)temp_array.push_back(a[j++]);for(int i = 0; i < temp_array.size(); i++) {a[first + i] = temp_array[i];}}void merge_sort(vector<double>& a, int first, int last) {if(first < last) {int mid = (first + last) / 2;merge_sort(a, first, mid);merge_sort(a, mid + 1, last);merge_array(a, first, mid, last);}}/* Quick Sort */void quick_sort(vector<double>& nums, long left, long right) {if(left < right) {swap(nums[left], nums[(left + right)/2]);int i = left, j = right, x = nums[left];while(i < j) {while(i < j && nums[j] >= x)--j;if(i < j)nums[i++] = nums[j];while(i < j && nums[i] < x)++i;if(i < j)nums[j--] = nums[i];}nums[i] = x;quick_sort(nums, left, i - 1);quick_sort(nums, i + 1, right);}}/* Choose Sort */void choose_sort(vector<double>& nums) {long flag_position = 0;for(int i = 0; i < nums.size(); ++i) {flag_position = i;for(int j = i + 1; j < nums.size(); ++j) {if(nums[j] < nums[flag_position])flag_position = j;}swap(nums[i], nums[flag_position]);}}/* Shell Sort */void shell_sort(vector<double>& nums) {for(int gap = nums.size()/2; gap > 0; gap /= 2) {for(int i = 1; i < nums.size(); ++i)for(int j = i - 1; j > 0 && nums[j] > nums[j + 1]; --j)swap(nums[j], nums[j + 1]);}}/* Insert Sort */void insert_sort(vector<double>& nums) {for (int i = 1; i < nums.size(); i++)for (int j = i - 1; j > 0 && nums[j] > nums[j + 1]; --j) {swap(nums[j], nums[j + 1]);}}/* Bubble Sort */void bubble_sort(vector<double>& nums) {int flag = nums.size();while (flag > 0) {int k = flag;flag = 0;for (int i = 1; i < k; ++i){if (nums[i - 1] > nums[i]) {swap(nums[i - 1], nums[i]);flag = i;}}}}/* print sorted number */void print(vector<double>& nums) {for (int i = 0; i < nums.size(); ++i){cout << nums[i] << endl;}}/* generate random number */double random(double start, double end){return start + (end - start)*rand() / (RAND_MAX + 1.0);}int main(int argc, char const *argv[]){int sort_nums_size = 100000;// random numbersrand(unsigned(time(0)));rand();vector<double> nums;for (long i = 0; i < sort_nums_size; i++) {nums.push_back(random(0, 10000));}// sort, a example of heap sortclock_t start_time = clock();heap_sort(nums);clock_t time_cost = clock() - start_time;cout << "Heap Sort: " << time_cost << "ms" << endl; // time cost// print(nums); // print elementssystem("pause");return 0;}
0 0
- 常用排序算法分析实现(C语言)
- 常用排序算法分析与实现
- 常用排序算法的实现和分析
- 常用排序算法分析(C++实现)
- 常用排序算法的分析与实现
- 用C语言实现常用排序算法
- 常用排序算法——C实现
- 常用排序算法C语言实现
- Objective-C实现常用的排序算法
- 用C语言实现常用排序算法
- 常用排序算法实现(C++)
- 常用排序算法的C语言实现
- 常用排序算法分析
- 常用排序算法分析
- 常用排序算法分析
- 常用排序算法之冒泡排序c及lua实现
- 常用排序算法之插入排序c及lua实现
- 常用排序算法之选择排序c及lua实现
- ImportError: libmysqlclient.so.18: cannot open shared object file: No such file or directory
- 使用retrofit框架
- intelliJ idea创建分层的项目结构
- 分布式版本控制系统Git
- mybatis 异常处理:Invalid bound statement (not found)
- 常用排序算法分析(C++实现)
- 类行为和线程处理
- eclipse+tomcat开发web页面遇到问题汇总
- java设计模式——装饰模式(Decorator Pattern)
- BitmapFactory的用法
- 光纤通信
- OpenCV仿射变换+投射变换+单应性矩阵
- pixhawk源码下载与编译
- 树套树之线段树套平衡树(ZOJ2112 Dynamic Rankings)