您的位置:首页 > 理论基础 > 数据结构算法

【数据结构练习】排序——堆排序和快排

2012-12-16 09:51 260 查看
上机考试考完了,但是笔试还没有考,所以把以前的代码翻了出来研究研究

主要是研究快排和堆排序

//============================================================================
// Name        : leap.cpp
// Author      :
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
using namespace std;

template<class T>    //qsort 快排,返回递增序列
void quicksort(T *p,int s,int e)  //array   low   high
{
if(s<e)
{
int i=s,j=e;
T tmp=p[e];//选取最后一个记录做为轴记录
while(i<j)
{
while(p[i]<tmp&&i<j) ++i;
if(i<j) p[j--]=p[i];
while(tmp<p[j]&&i<j) --j;
if(i<j) p[i++]=p[j];
}
p[i]=tmp;
//加入一个查看当前排序状态
for(int no = 0;no< 10;no++){
cout<<p[no]<<" ";
}
cout<<endl;
quicksort(p,s,i-1);
quicksort(p,i+1,e);
}
}

struct _heap{     //堆排序   弹出最小的
int a[32768],n;
_heap(){n=0;}
int pre(int p){return (p-1)>>1;};    //  >> stand for /
int left(int p){return (p<<1)+1;};  //   << stand for *
int right(int p){return (p<<1)+2;};
void ins(int x){   //  创建
int p;
n++;
for(p=n-1;p>0;){
if(x<a[pre(p)])
a[p]=a[pre(p)],p=pre(p);
else break;
}
a[p]=x;
}
int pop(){
int p,x=a[0],tmp;
for(p=0,n--;left(p)<n;){
tmp=(right(p)<n&&a[right(p)]<a[left(p)])?right(p):left(p);
if(a[tmp]<a
)a[p]=a[tmp],p=tmp;
else break;
}
a[p]=a
;
return x;
}
};
struct heap   //堆排序   弹出最大的
{
int ele[22222];
int n;
heap(){n=0;}
int pre(int k) {;return (k-1)>>1;}
int lson(int k){return (k<<1)+1;}
int rson(int  k){return (k<<1)+2;}
void ins(int x)
{
int p=n++;
for(;p>0;)
{
if(ele[pre(p)]<x)
{
ele[p]=ele[pre(p)];
p=pre(p);
}
else break;
}
ele[p]=x;
}
int pop()
{
int tmp,p=0,x=ele[0];
for(n--;lson(p)<n;)
{
tmp=(rson(p)<n&&ele[rson(p)]>ele[lson(p)])?rson(p):lson(p);
if(ele[tmp]>ele
)
{
ele[p]=ele[tmp];
p=tmp;
}
else break;
}
ele[p]=ele
;
return x;
}
}G;

int main() {

srand((int)time(0));
for(int i = 0;i<10;i++){  //堆排序示例
G.ins(rand());
}
int n = 10;
cout<<"堆排,排序好的:"<<endl;
while(n--){
printf("%d  ",G.pop());
}
puts("\n------------------");
//快排
int a [10];
for(int i = 0;i<10;i++){
a[i] = rand();
}
quicksort(a,0,10);
n = 10;
cout<<"快排,排序好的 :"<<endl;
while(n--){  //倒着输出
printf("%d ", a[9-n] );
}
return 0;
}


运行结果:



在这我选中的地方我发现这部分的序列并没有改变,只不过这次提前了一行。大家帮忙分析一下。尝试着自己试试

我猜测是在递归调用的时候,他是随机的递归,无法输出目前的序列

例如:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: