【数据结构练习】排序——堆排序和快排
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; }
运行结果:
在这我选中的地方我发现这部分的序列并没有改变,只不过这次提前了一行。大家帮忙分析一下。尝试着自己试试
我猜测是在递归调用的时候,他是随机的递归,无法输出目前的序列
例如:
相关文章推荐
- 数据结构-选择排序-堆排序
- 【数据结构】将一组数据升序排序(利用堆排序)
- 常用数据结构_排序_查找练习
- C++代码,数据结构-内部排序-选择排序-堆排序
- 数据结构学习 之 链表 练习 链表排序功能.(热身练习)
- 数据结构练习——堆排序
- 【数据结构】常用比较排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序)
- 数据结构练习(09)排序数组中和为给定值的两个数字
- 数据结构练习:快速排序
- 数据结构_练习 第8章 排序
- C++数据结构 排序 二分 插入 冒泡 基数 归并 直选 快排 希尔 堆排序
- 堆排序--数据结构排序1
- c++实现数据结构中的各种排序方法:直接插入、选择,归并、冒泡、快速、堆排序、shell排序
- 数据结构练习:快速排序
- 数据结构排序问题---堆排序及各种排序时间空间复杂度
- 数据结构学习笔记 --- 排序(选择排序、堆排序)
- 数据结构 排序(堆排序)
- 数据结构_内部排序_希尔排序_快速排序_堆排序_归并排序_地址排序
- 算法和数据结构---排序---堆排序
- 数据结构学习笔记排序 (冒泡、插入、希尔、堆排序、归并排序)