69,372
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#include <string.h>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
#define N 1000000
int a[N],b[N];
int myrand()
{
int rs=0;
int n=N/10;
n=10000000;
while(n)
{
rs=rs*10+rand()%10;
n/=10;
}
return rs;
}
void init()
{
for(int i=0;i<N;i++)
{
a[i]=myrand();
}
}
void merge(int left,int mid,int right)
{
memcpy(b+left,a+left,(right-left+1)*sizeof(int));
int i=left,j=mid+1,k=left;
while(i<=mid&&j<=right)
{
if(b[i]<b[j])
a[k++]=b[i++];
else
a[k++]=b[j++];
}
while(i<=mid)
a[k++]=b[i++];
while(j<=right)
a[k++]=b[j++];
}
void mergeSort(int left,int right)
{
if(left<right)
{
int mid=(left+right)/2;
mergeSort(left,mid);
mergeSort(mid+1,right);
merge(left,mid,right);
}
}
int partition(int left,int right)
{
int pivot=a[left];
while(left<right)
{
while(left<right&&a[right]>=pivot)
right--;
if(left<right)
a[left++]=a[right];
while(left<right&&a[left]<=pivot)
left++;
if(left<right)
a[right--]=a[left];
}
a[left]=pivot;
return left;
}
void qsort(int left,int right)
{
if(left<right)
{
int mid=partition(left,right);
qsort(left,mid-1);
qsort(mid+1,right);
}
}
void qsort2(int left,int right)
{
struct shot
{
int left;
int right;
int mid;
int stage;
};
shot cur,p;
stack<shot> st;
cur.left=left,cur.right=right;
cur.stage=0;
st.push(cur);
while(st.size())
{
cur=st.top();
st.pop();
switch(cur.stage)
{
case 0:
if(cur.left<cur.right)
{
cur.mid=partition(cur.left,cur.right);
cur.stage++;
st.push(cur);
p.left=cur.left,p.right=cur.mid-1,p.stage=0;
st.push(p);
}
break;
case 1:
{
p.left=cur.mid+1,p.right=cur.right,p.stage=0;
st.push(p);
break;
}
}
}
}
int main()
{
long long t1,t2;
// test();
for(int type=0;type<10;type++)
{
init();
t1=GetTickCount();
switch(type)
{
case 0: //STL快排
sort(a,a+N);
t2=GetTickCount();
printf("STL快排%f秒\n",(t2-t1)/1000.0);
break;
case 1: //非递归快排
qsort2(0,N-1);
t2=GetTickCount();
printf("非递归快排%f秒\n",(t2-t1)/1000.0);
break;
case 2: //递归快排
qsort2(0,N-1);
t2=GetTickCount();
printf("递归快排%f秒\n",(t2-t1)/1000.0);
break;
case 3: //归并排序
mergeSort(0,N-1);
t2=GetTickCount();
printf("归并排序%f秒\n",(t2-t1)/1000.0);
break;
}
}
system("pause");
}