这是最后一个实验,我自己的信念是认真对待自己想要去做的事情,哪怕是你在帮,都不要放开它,坚持自己的选择,踏实的走下去,这条路需要慢慢积累!
这次直接上传代码:
文件1 t11.h
#include"stdio.h"
#include"string.h"
#include"ctype.h"
#include"malloc.h"
#include"stdlib.h" //atoi(),exit();
#include"io.h" //eof()
#include"math.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int Boolean;
文件2 sort.h
struct sort
{
int *elem;
int length;
};
int mark;
文件3 sort.cpp
void print(sort T) // 打印出数据
{
int i=0;
printf("\t\t");
while(i < T.length)
printf("%-3d",*(T.elem+i++));
}
void initsort(sort &T,sort &R) // 初始化相关数据
{
printf("输入数的个数:");
scanf("%d",&T.length);
R.length=T.length;
T.elem=(int*)malloc(T.length*sizeof(int));
R.elem=(int*)malloc(T.length*sizeof(int));
printf("输入这%d个数:\n",T.length);
int i=0;
while(i < T.length)
{
scanf("%d",(T.elem+i));
*(R.elem+i)=*(T.elem+i);
i++;
}
}
int sortq(sort &T,int i,int j) // 进行快速排序
{
int log1=*(T.elem+i); // 要比较的标志元素
int log;
while(i < j)
{
while(i < j && *(T.elem+j) >= log1) // 从末端开始往前比较
--j;
log=*(T.elem+i); // 将更小的安排在log1的左端
*(T.elem+i)=*(T.elem+j);
*(T.elem+j)=log;
mark++;
printf("\n第%d次交换:",mark);
print(T);
while(i < j && *(T.elem+i) <= log1) // 从开始端开始与log1比较
++i; // 找到比log1大的元素,安排该元素的位置
log=*(T.elem+i);
*(T.elem+i)=*(T.elem+j);
*(T.elem+j)=log;
mark++;
printf("\n第%d次交换:",mark);
print(T);
}
return log=i; // 返回结束的位置
}
void Qsort(sort &T,int i,int j) // 递归调用
{
int log; // 获取位置标记
if(i < j)
{
log=sortq(T,i,j); // 找到标记位置,然后划分成两部分
Qsort(T,i,log-1); // 对左半部分进行排序
Qsort(T,log+1,j); // 对有半部分递归调用排序
}
}
void heapsort(sort &R,int s,int m) // 堆排序
{
int rc=*(R.elem+s); // 将s位置的元素作为标记元素
for(int j=2*s+1;j<=m;j*=2) // 找到s位置的左右孩子,比较大小并且执行到叶子
{
if(j < m && *(R.elem+j) < *(R.elem+j+1) ) ++j; // 找到数较大的元素位置
if(rc > *(R.elem+j)) break; // s位置元素大于左右孩子,不要比较
*(R.elem+s)=*(R.elem+j); // 交换值
s=j; // 将j的位置作为下一个开始标志
}
*(R.elem+s)=rc; // 填补交换值
}
void heap(sort &R) // 堆排序的控制
{
int log; // 记录值
mark=1;
for(int i=(R.length-1)/2;i>=0;i--) // 将一个无序的 构建成一个有序的堆
{
heapsort(R,i,R.length-1);
printf("\n第%d步为:",mark);
mark++;
print(R);
}
for(i=R.length-1;i>0;i--) // 将元素存入最后位置
{
log=*(R.elem);
*R.elem=*(R.elem+i);
*(R.elem+i)=log;
heapsort(R,0,i-1); // 对剩下的进行堆排序
printf("\n第%d步为:",mark);
mark++;
print(R);
}
}
文件4 main_sort.cpp
#include"t11.h"
#include"sort.h"
#include"sort.cpp"
void main()
{
sort T,R; // 定义两个变量
mark=0; // 标记置为0
initsort(T,R); // 初始化相关数据
Qsort(T,0,T.length-1); // 递归调用进行快速排序
printf("\n");
printf("\n\n\n重构数据,数据为:\n\n");
print(R);
printf("\n\n");
heap(R); // 进行堆排序
printf("\n");
}
所有的实验已经全部编写完了,自己认真对待了数据结构,数据结构对程序设计是思维上的转变,还记得自己没学时,只会编编简单的程序,而且杂乱无章,调理不清,无法编出较大的程序,但现在感觉自己的程序设计能力变强了,对问题的考虑也不局限于固定思维了,数据结构提供了很多方法,我想我需要做的就是熟透她,要知道微软面试数据结构很重要,这也体现了数据结构在计算机程序设计的重要性,希望大家要珍惜学习数据结构的机会,认真学好,实践最重要,加油!!!
留住最真的于2012.05.23 21:40写~~~~~~~~~~~~~~~~~~~~~
代码的下载地址贴出来了:http://download.csdn.net/detail/wu10045125/4679621