[置顶] 数据结构试验-快速排序-堆排序

[置顶] 数据结构试验-快速排序-堆排序_第1张图片这是最后一个实验,我自己的信念是认真对待自己想要去做的事情,哪怕是你在帮,都不要放开它,坚持自己的选择,踏实的走下去,这条路需要慢慢积累!

这次直接上传代码:

文件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");
}

[置顶] 数据结构试验-快速排序-堆排序_第2张图片

所有的实验已经全部编写完了,自己认真对待了数据结构,数据结构对程序设计是思维上的转变,还记得自己没学时,只会编编简单的程序,而且杂乱无章,调理不清,无法编出较大的程序,但现在感觉自己的程序设计能力变强了,对问题的考虑也不局限于固定思维了,数据结构提供了很多方法,我想我需要做的就是熟透她,要知道微软面试数据结构很重要,这也体现了数据结构在计算机程序设计的重要性,希望大家要珍惜学习数据结构的机会,认真学好,实践最重要,加油!!!

留住最真的于2012.05.23   21:40写~~~~~~~~~~~~~~~~~~~~~

 

 代码的下载地址贴出来了:http://download.csdn.net/detail/wu10045125/4679621

你可能感兴趣的:([置顶] 数据结构试验-快速排序-堆排序)