今天看剑指offer突然发现下学期都要去面试了,还没自己实现过快排非递归和归并非递归,这怎么能行呢,于是就写了一下。

(虽然有点卡壳,又回去翻了下算导,还是顺利写出来了)

先放图: 一亿数据量:

#pragma warning(disable:4996)
#include <iostream>
#include <string>
#include <cctype>
#include<vector>
#include<list>
#include<cstring>
#include<typeinfo>
#include<set>
#include<map>
#include<deque>
#include<regex>
#include<sstream>
#include<cstdlib>
#include<queue>
#include<stdlib.h>
#include<stdio.h>
#include<stack>
#include<algorithm>
#include<thread>
#include<mutex>
#include<assert.h>
using namespace std;
void MergeSort(vector<int>& nums)
{
if (nums.empty())
{
return;
}
int len = nums.size();
vector<int> temp(len, 0); //临时数组,下面会用
for (int merge_step = 1; merge_step < len; merge_step <<= 1)//当merge_step为k,表示merge两个长度k的有序序列成一个长度2k的序列
{
for (int begin = 0; begin < len - merge_step; begin += (merge_step << 1))
{
int le = begin, ri = begin + merge_step; //左右区间起点
int le_end = ri, ri_end = min(ri + merge_step, len); //左右区间终点(半闭半开区间)
int i = 0;
while (le < le_end and ri < ri_end)
{
if (nums[le] < nums[ri])
{
temp[i] = nums[le];
++le;
}
else
{
temp[i] = nums[ri];
++ri;
}
++i;
}
while (le < le_end)
{
temp[i] = nums[le];
++i;
++le;
}
while (ri < ri_end)
{
temp[i] = nums[ri];
++i;
++ri;
}
for (int j = 0; j < i; ++j) //写回原数组
{
nums[begin + j] = temp[j];
}
}
}
} void InitiateRandomVector(vector<int>& nums)
{
srand(0);
for (auto& num : nums)
{
num = rand();
}
}
int partition(vector<int>&nums,int le,int ri) //划分区间函数
{
srand(0);
int rand_num=le+rand()%(ri-le); //随机生成一个索引
swap(nums[ri],nums[rand_num]); //换到结尾
int stable=nums[ri];
int i=le-1,j=le;
while(j<ri)
{
if(nums[j]<stable)
{
int temp=nums[j];
nums[j]=nums[++i];
nums[i]=temp; //i存的都是小于基准数的值
}
++j;
}
swap(nums[i+1],nums[ri]);
return i+1; //返回基准数的索引
}
void quick_sort(vector<int>& nums,int le,int ri) //[le,ri]闭区间
{
if(le>=ri)
{
return;
}
int mi=partition(nums,le,ri);
quick_sort(nums,le,mi-1);
quick_sort(nums,mi+1,ri);
}
void QuickSort_Recursion(vector<int>& nums) //递归版
{
quick_sort(nums,0,nums.size()-1);
} void QuickSort_Iteration(vector<int>&nums) //迭代版
{
if(nums.empty())
{
return;
}
stack<int> sta;
sta.push(0);
sta.push(nums.size()-1);
int le,ri,mi;
while(!sta.empty())
{
ri=sta.top(); //后push的右边界故先pop
sta.pop();
le=sta.top();
sta.pop();
mi=partition(nums,le,ri);
if(mi-1>le)
{
sta.push(le);
sta.push(mi-1);
}
if(mi+1<ri)
{
sta.push(mi+1);
sta.push(ri);
}
}
}
int main(int argc, char** argv)
{
cout<<"Input data size:";
int siz;
cin>>siz;
vector<int>nums(siz);
cout<<"Data size:"<<siz<<endl;
InitiateRandomVector(nums);
int t1=time(0);
MergeSort(nums);
cout<<"My merge sort time:"<<time(0)-t1<<"s"<<endl;
InitiateRandomVector(nums);
t1=time(0);
QuickSort_Recursion(nums);
cout<<"My quick sort(recursion) time:"<<time(0)-t1<<"s"<<endl;
InitiateRandomVector(nums);
t1=time(0);
sort(nums.begin(),nums.end());
cout<<"STL sort time:"<<time(0)-t1<<"s"<<endl;
InitiateRandomVector(nums);
t1=time(0);
QuickSort_Iteration(nums);
cout<<"My quick sort(iteration) time:"<<time(0)-t1<<"s"<<endl;
getchar();
return 0;
}

最新文章

  1. C++类继承关系视图的自动生成
  2. webstormkey
  3. 老贼博客php教程从零学习PHP开始写作,顺祝新同事快乐!
  4. php5.3到php7.0.x新特性介绍
  5. 十条jQuery代码片段助力Web开发效率提升
  6. Mars 是微信官方的终端基础组件,是一个使用 C++ 编写的业平台性无关的基础组件
  7. 今天开始自学Andrew Ng的机器学习,希望可以坚持下来
  8. [四]JFreeChart实践三之饼图
  9. Hibernate 一对多单向关联Demo
  10. Java基础知识强化之IO流笔记04:throw和throws的区别
  11. java优势
  12. Cannot find class in classpath 报错
  13. hdu 5288 OO’s Sequence(计数)
  14. 代码中实际运用memcached——.NET
  15. linux下动态连接变为静态打包,使用statifier_S展翅飞_新浪博客
  16. ES6 二进制数组
  17. springMVC源码分析--SimpleControllerHandlerAdapter(三)
  18. cloudera manager 安装配置
  19. vc++高级班之多线程篇[6]---线程间的同步机制①
  20. 100种不同图片切换效果插件pageSwitch

热门文章

  1. mybatis(三):框架结构
  2. 08 部署nginx web服务器(转发fastDFS请求)
  3. C++-POJ1995-Raising Modulo Numbers[快速幂]
  4. ModuleNotFoundError: No module named &#39;numpy.testing.nosetester&#39;
  5. python多线程返回值的实现与处理
  6. 一点点学习PS--实战二
  7. redhat 桌面系统配置
  8. energy/heating data source
  9. SQL Server经典sql语句大全(转)
  10. pikaqiu练习平台(XSS(跨站脚本))