数据结构实验八内部排序
数据结构实验八 排序
实验八排序
一、实验目的
1、掌握常用的排序方法,如归并排序、快速排序等。
2、深刻理解排序的定义和排序方法的特点,并能加以灵活应用。
3、能够分析各种算法的效率和适用条件。
二、实验要求
1、认真阅读程序。
2、上机调试,并运行程序。
3、保存和截图程序的运行结果,并结合程序进行分析。
三、实验内容和基本原理
1、实验8.1 归并排序的实现
已知关键字序列为{1,8,6,4,10,5,3,2,22},请对此序列进行归并排序,并输出结果。见参考程序8.1。
2、实验8.2快速排序的实现
快速排序是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。见参考程序8.2。
参考程序8.1归并排序
#include"stdio.h"
int num=0;
void print_data(int data[],int first,int last)
{
int i=0;
for(i=0;i<first;i++)
printf("*");
for(i=first;i<=last;i++)
printf("%3d",data[i]);
for(i=last;i<=8;i++)
printf("*");
printf("\n");
}
void merge(int array[],int first,int last)/*一趟归并*/
{
int mid,i1,i2,i3;
int temp[10];
int i,j;
mid=(first+last)/2;
内部排序比较 (实验报告+源程序)C++
实验报告3
实验名称:数据结构与软件设计实习
题目:内部排序算法比较
专业:生物信息学班级:01 姓名:学号:实验日期:2010.07.24
一、实验目的:
比较冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序;
二、实验要求:
待排序长度不小于100,数据可有随机函数产生,用五组不同输入数据做比较,比较的指标为关键字参加比较的次数和关键字移动的次数;
对结果做简单的分析,包括各组数据得出结果的解释;
设计程序用顺序存储。
三、实验内容
对各种内部排序算法的时间复杂度有一个比较直观的感受,包括关键字比较次数和关键字移动次数。
将排序算法进行合编在一起,可考虑用顺序执行各种排序算法来执行,最后输出所有结果。
四、实验编程结果或过程:
1. 数据定义
typedef struct { KeyType key; }RedType; typedef struct { RedType r[MAXSIZE+1]; int length;
}SqList;
2. 函数如下,代码详见文件“排序比较.cpp”int Create_Sq(SqList &L)
void Bubble_sort(SqList &L)//冒泡排序void InsertSort(SqList &L)//插入排序
void SelectSort(SqList &L) //简单选择排序int Partition(SqList &L,int low,int high) void QSort(SqList &L,int low,int high)//递归形式的快速排序算法
数据结构实验七、八 查找排序及其应用
实验七、八查找排序应用问题实现一、实验目的
1.理解掌握动态查找表在计算机中的各种实现方法。
2.熟练掌握顺序查找、折半查找在顺序表上的实现及解决简单的应用问题。
3.熟练掌握常用排序算法在顺序表上的实现,能解决简单的应用问题。二、实验内容
⏹题目:从键盘上输入n个学生的基本信息(学号、姓名、班级、年龄等),
建立其顺存储结构,然后执行如下操作:
1、分别按学号、姓名、班级、年龄进行插入排序、交换排序和选择排序并显
示排序结果(排序算法任选,但必须保证每种算法至少使用一次);
2、可按学号、姓名、班级或其组合查找某一学生,若查找成功,则输出其基
本信息,否则提示出错。
试设计程序完成上述功能。
提示:上述操作可用菜单方式实现,字符数据类型可用字符串比较函数strcmp (const char *, const char *) ,在string.h 头文件中
测试数据:自定
⏹设计要求:
1、上机前,认真学习教材,理解掌握各种查找算法、排序算法的特点及在
计算机中的实现方法
2、上机前,认真独立地写出本次程序清单,流程图,该程序包括数据类型
以及每一种操作的具体的函数定义和主函数。有关算法分别参阅讲义和
参考教材事例。
⏹头文件中数据结构设计及相关函数声明:
#include<iostream.h>
#include<string.h>
#define MAXSIZE 20 //设记录不超过20个
typedef struct { //学生数据结构体定义
int Snumber; //学号
char Name[10]; //姓名
数据结构实验--各种排序算法的比较
实验题目:各种查找及排序算法比较
实验内容:
内部排序算法——插入排序(直接插入排序、折半插入排序)、交换排序(冒泡、快速排序)、选择排序(直接选择排序、堆排序)和归并排序(2-路归并排序)的具体实现。
目的与要求:
掌握各种内部排序算法的特点,并对一整型数组排序,比较不同算法的速度。
实验算法:
1)、数据结构描述:
主函数中的a数组保存需要排序数组,将数组作为自变量输入到各种
排序算法的函数中,各个函数返回值为排序之后的数组,在主函数中
以一个循环体输出。
2)、函数和算法描述:
主函数main先用循环体保存数组a,然后输出菜单,通过switch语
句调用排序函数,将数组排序后输出。
InsertSort为直接插入排序对应的函数,并附有插入元素到数组的功能,函数主体是从数组第二个元素开始与其前的元素一一比较大小,
并且插入到合适位置使得该元素的大小位于相邻元素之间。
BinsertSort为折半插入排序对应的函数,函数主体是在如上所述进行插入时,先比较待插入元素与其前的有序列的中心元素的大小关系,
以此循环来判断插入位置。
BubbleSort为冒泡排序对应的函数,为二重循环结构,外循环每循环一次,决定出待排序部分的最大值并置于待排部分的末端,内循环
对相邻两个元素大小作比较,进行调换。
Partition QuickSort为快速排序对应的函数,建有两个指针,从待
排部分两端进行扫描,一次循环之后,将极大值和极小值各置于一端。
SelectMinKey SSSort为选择排序对应的函数,每循环一次,直接选出待排序部分中最小的元素并置于已排序部分之后,直至待排部分
数据结构实验八快速排序实验报告
数据结构实验八快速排序实验报告
一、实验目的
1.掌握快速排序算法的原理。
2. 掌握在不同情况下快速排序的时间复杂度。
二、实验原理
快速排序是一种基于交换的排序方式。它是由图灵奖得主 Tony Hoare 发明的。快速
排序的原理是:对一个未排序的数组,先找一个轴点,将比轴点小的数放到它的左边,比
轴点大的数放到它的右边,再对左右两部分递归地进行快速排序,完成整个数组的排序。
优缺点:
快速排序是一种分治思想的算法,因此,在分治思想比较适合的场景中,它具有较高
的效率。它是一个“不稳定”的排序算法,它的工作原理是在大数组中选取一个基准值,
然后将数组分成两部分。具体过程如下:
首先,选择一个基准值(pivot),一般是选取数组的中间位置。然后把数组的所有值,按照大小关系,分成两部分,小于基准值的放左边,大于等于基准值的放右边。
继续对左右两个数组递归进行上述步骤,直到数组只剩一个元素为止。
三、实验步骤
1.编写快速排序代码:
void quicksort(int *a,int left,int right) {
int i,j,t,temp;
if(left>right)
return;
temp=a[left];
i=left;
j=right;
while(i!=j) {
// 顺序要先从右往左移
while(a[j]>=temp&&i
j--;
while(a[i]<=temp&&i
i++;
if(i
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];
a[i]=temp;
quicksort(a,left,i-1);
数据结构:第八章 排序
49 38 65 97 76 13 27 49’
直
13 38 65 97 76 49 27 49’
接
选
13 27 65 97 76 49 38 49’
择 排
13 27 38 97 76 49 65 49’
序
13 27 38 49 76 97 65 49’
示
例
13 27 38 49 49’ 97 65 76
算法分析
▪ 直接插入排序算法由两重循环组成,对于有n个记录的排 序,整个过程执行(n-1)趟排序.内循环表明完成一趟排序 所需进行的记录关键字间的比较和记录的后移。
▪ 算法比较与移动次数与记录初始排列有关.若正序则是最 好情况。每一趟排序中仅需进行一次关键字的比较,所 以总的比较次数为n-1。在while循环之前和之中,至少 要移动记录两次,所以总的移动次数为2(n-1)。若逆序则 是最坏情况。这时的记录比较和移动次数分别为:
比较次数的最大值 (n i) n(n 1) / 2 O(n2 ) i 1
2、最好情况是每次所取的基准都是当前无序区的“中值”记 录,划分的结果是基准的左右两个无序子区的长度大致相等。
设C(n)表示对长度为n的序列进行快速排序所需的比 较次数,显然,它应该等于对长度为n的无序区进行划分所 需的比较次数n-1,加上递归地对划分所得的左右两个无序 子区进行快速排序所需的比较次数。假设记录长度n=2k , k=log2n,因此有:
实验8 内排序
实验报告
一、实验目的
1、掌握插入排序、选择排序、交换排序、归并排序等各种排序方法的基本思想并能用C/C++语言实现。
2、掌握各种排序方法的特点及适用情形,并能在解决实际问题的过程中灵活选用不同的排
序方法。
3、掌握各种排序方法的操作过程及其依据。
二、实验环境
PC微机,Windows,DOS,Turbo C或Visual C++
三、实验内容
1、调试并运行实验指导里的示例代码,仔细阅读、认真理解代码含义,对程序结果进行分析
2、比较直接插入排序法、简单选择排序、希尔排序的思想,并编程实现这几种排序方法。
四、实验步骤
1、调试并运行实验指导里的示例代码,仔细阅读、认真理解代码含义,对程序结果进行分析
附程序运行结果图,及分析内容(该内容需删除)
2、比较直接插入排序法、简单选择排序、希尔排序的思想,并编程实现这几种排序方法。附程序源代码,运行结果截图(该内容需删除)
#include
#include
#include
#include
#define MAX 20
typedefintKeyType;
typedef char InfoType[10];
typedefstruct
{
KeyType key;
InfoType data;
}RecType;
voidInsertSort(RecType R[],int n)
{
inti,j,k;
RecType temp;
for(i=1;i
{
temp=R[i];
j=i-1;
while(j>=0 &&temp.key
{
R[j+1]=R[j];
j--;
}
R[j+1]=temp;
排序算法实验报告
数据结构实验报告
八种排序算法实验报告
一、实验内容
编写关于八种排序算法的C语言程序,要求包含直接插入排序、希尔排序、简单项选择择排序、堆排序、冒泡排序、快速排序、归并排序和基数排序。
二、实验步骤
各种内部排序算法的比较:
1.八种排序算法的复杂度分析〔时间与空间〕。
2.八种排序算法的C语言编程实现。
3.八种排序算法的比较,包括比较次数、移动次数。
三、稳定性,时间复杂度和空间复杂度分析
比较时间复杂度函数的情况:
时间复杂度函数O(n)的增长情况
所以对n较大的排序记录。一般的选择都是时间复杂度为O(nlog2n)的排序方法。
时间复杂度来说:
(1)平方阶(O(n2))排序
各类简单排序:直接插入、直接选择和冒泡排序;
(2)线性对数阶(O(nlog2n))排序
快速排序、堆排序和归并排序;
(3)O(n1+§))排序,§是介于0和1之间的常数。
希尔排序
(4)线性阶(O(n))排序
基数排序,此外还有桶、箱排序。
说明:
当原表有序或基本有序时,直接插入排序和冒泡排序将大大减少比较次数和移动记录的次数,时间复杂度可降至O〔n〕;
而快速排序则相反,当原表基本有序时,将蜕化为冒泡排序,时间复杂度提高为O〔n2〕;
原表是否有序,对简单项选择择排序、堆排序、归并排序和基数排序的时间复杂度影响不大。
稳定性:
排序算法的稳定性:假设待排序的序列中,存在多个具有相同关键字的记录,经过排序,这些记录的相对次序保持不变,则称该算法是稳定的;假设经排序后,记录的相对次序发生了改变,则称该算法是不稳定的。
稳定性的好处:排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的。另外,如果排序算法稳定,可以防止多余的比较;
数据结构实验8排序
实验八排序
一、实验目的
1.熟悉掌握教材中所介绍的几种排序方法。
2.学会分析各种内排序算法的性能。
二、实验内容
1.随机产生20位整数
2.输入序列,编写程序,按下列排序方法将序列从小到大排序并输出。
(1)冒泡排序
(2)快速排序
3.纪录每种方法比较次数和移动次数
三、实验步骤
1、冒泡排序
冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较。如此下去,直至最终完成排序。
2、快速排序
(1)基本思想
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年
提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,
其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对
这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个
数据变成有序序列。
(2)实现方法
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到
它后面,这个过程称为一趟快速排序。一趟快速排序的算法是:
1)设置两个变量I、J,排序开始的时候:I=1,J=N-1;
2)以第一个数组元素作为关键数据,赋值给X,即X=A[0];
3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于X的值,让该值与X交换;
数据结构实验报告内排序
实验题目:内排序
一、实验目的和任务
1 掌握堆排序、快速排序算法;
2 掌握直接插入排序、简单选择排序、气泡排序算法。
二、实验内容及原理
1给定一组元素,如(46,74,16,53,14,26,40,38,86,65,27,34),写出堆排序、快速排序算法及程序。
2复习之前学过的直接插入排序、简单选择排序、气泡排序,并写出相应的算法及程序。
3 如果此实验要求用外排序完成,参考书中的程序仿写外排序的相关程序。
四、实验数据及程序代码
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
struct ElemType {
int num;
int stn;
char bir[12];
};
void Sift(ElemType A[], int n, int i) //堆排序
{
ElemType x = A[i];
int j;
j = 2 * i + 1;
while (j <= n - 1) {
if (j<n - 1 && A[j].stn<A[j + 1].stn)j++;
if (x.stn<A[j].stn)
{
A[i] = A[j]; i = j; j = 2 * i + 1;
}
else break;
}
A[i] = x;
}
void HeapSort(ElemType A[], int n)
{
ElemType x;
int i;
for (i = n / 2 - 1; i >= 0; i--)Sift(A, n, i);
数据结构实验八 快速排序实验报告
数据结构实验课程最终报告题目:实验八快速排序
专业班级:计算机科学与技术
姓名:XXX
学号:
指导老师: 李晓鸿
完成日期:2015、01、06
一、需求分析
背景
排序就是计算机内经常进行得一种操作,其目得就是将一组“无序”得记录序列调整为“有序"得记录序列。
假设含n个记录得序列为{R1,R2, …,Rn}
其相应得关键字序列为{K1,K2, …,K n}
这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系:
Kp1≤K p2≤…≤K pn
按此固有关系将上式记录序列重新排列为{ R p1,R p2,…,R pn}得操作称作排序。
排序算法就是计算机科学中最重要得研究问题之一.对于排序得研究既有理论上得重要意义,又有实际应用价值.它在计算机图形、计算机辅助设计、机器人、模式识别、及统计学等领域具有广泛应用。常见得排序算法有起泡排序、直接插入排序、简单选择排序、快速排序、堆排序等。
例1:有时候应用程序本身就需要对信息进行排序。为了准备客户账目,银行需要根据支票得号码对支票排序;
例2:在一个绘制互相重叠得图形对象得程序中,可能需要根据一个“在上方”关系将各对象排序,以便自下而上地绘出对象。
例3:在一个由n个数构成得集合上,求集合中第i小/大得数。
例4:对一个含有n个元数得集合,求解中位数、k分位数.
1.问题描述
在操作系统中,我们总就是希望以最短得时间处理完所有得任务。但事情总就是要一件件地做,任务也要操作系统一件件地处理。当操作系统处理一件任务时,其她待处理得任务就需要等待。虽然所有任务得处理时间不能降低,但我们可以安排它们得处理顺序,将耗时少得任务先处理,耗时多得任务后处理,这样就可以使所有任务等待得时间与最小。
数据结构实验8 查找与排序
在磁盘上创建一个目录,专门用于存储数据结构实验的程序。因为机房机器有还原卡,请同学们将文件夹建立在最后一个盘中,以学号为文件夹名。
实验八查找和排序
一、实验目的
掌握运用数据结构两种基本运算查找和排序,并能通过其能解决应用问题。
二、实验要求
1.掌握本实验的算法。
2.上机将本算法实现。
三、实验内容
for(i=0;i<L.length;i++)
cout<<setw(7)<<L.elem[i].sno<<setw(10)<<L.elem[i].sname<<setw(3)<<L.elem[i].sex<<setw(6)<<L.elem[i].roomno<<endl;
}wk.baidu.com
{
ElemType *elem;
int length;
};
void init(SqList &L)
{
L.elem=(ElemType *)malloc(MAXSIZE*sizeof(ElemType));
L.length=0;
}
void printlist(SqList L)
{ int i;
cout<<" sno name sex roomno\n";
数据结构课件 第八章排序
算法描述
void InsertSort(elementtype r[n+1]) { for ( i=2 ; i<=n ; ++ i ) { r[0]=r[i]; // 将待插入记录复制为哨兵 j=i-1; while(r[j].key>r[0].key) {r[j+1]=r[j]; j--; } r[ j+1]=r[0]; } } //插入到正确位置 插入到正确位置
Return
8.2 插入排序
基本思想:将待排序表看做是左、右两个部分, 基本思想:将待排序表看做是左、右两个部分,其中 左边为有序区,右边为无序区, 左边为有序区,右边为无序区,整个排序过程就是 将右边无序区中的元素逐个插入到左边的有序区中, 将右边无序区中的元素逐个插入到左边的有序区中, 以构成新的有序区。 以构成新的有序区。
ຫໍສະໝຸດ Baidu
2、在排序过程中,一般进行两种基本操作: 在排序过程中,一般进行两种基本操作: 比较两个关键字的大小; (1)比较两个关键字的大小; 将记录从一个位置移动到另一个位置。 (2)将记录从一个位置移动到另一个位置。 本章主要讨论在向量结构上各种排序方法的实现。 本章主要讨论在向量结构上各种排序方法的实现。 向量结构上各种排序方法的实现 为了讨论方便,假设待排记录的关键字均为整数, 为了讨论方便,假设待排记录的关键字均为整数, 均从数组中下标为1的位置开始存储,下标为0 均从数组中下标为1的位置开始存储,下标为0的 位置存储监视哨,或空闲不用。 位置存储监视哨,或空闲不用。
数据结构:第8章 排序1
直接插入排序(基于顺序查找)
折半插入排序(基于折半查找) 希尔排序(基于逐趟缩小增量)
一、直接插入排序
利用 “顺序查找”实现
“在R[1..i-1]中查找R[i]的插入位臵”
从R[i-1]起向前进行顺序查找, 监视哨设臵在R[0];
R[0]
R[i]
j R[0] = R[i];
j=i-1 插入位臵
// 设臵“哨兵” // 从后往前找
n
最坏的情况(关键字在记录序列中逆序有序):
“比较”的次数:
(n 2)( n 1) i 2 i 2
n
直接插入排序的时间复杂度为O(n2)
二、折半插入排序
因为 R[1..i-1] 是一个按关键字有
序的序列,则可以利用折半查找实现
“在R[1..i-1]中查找R[i]的插入位臵”,
如此实现的插入排序为折半插入排序。
// numOfD为增量个数
int i,j,k,m,span; RecordType temp; for(m=0;m<numofD;m++) //共numOfD次循环 { span=d[m]; //取本次的增量值 for(k=1;k<=span;k++) //共span个小组 { //对每个小组进行增量为span的直接插入排序 } }
内部排序方法大致可分下列几种类 型:
数据结构第八章 排序
56
49
78 11 65 41 (a)无序序列
36 n=8, int(n/2)=4开始
(1)由无序序列建初始堆的过程
25
25
56
49
56
数据结构
49
78 11 65 41
(a)无序序列
36 n=8, int(n/2)=4开始
25
25
56
41
11
36 11 65 41
78 (b): 78被筛选后的状态 11
25
41
41
36 56 65 49 下36一步11就可65以输4出9 堆顶36元素5,6 然后65将剩4余9 元素进一步调整成新堆
78
78
78
(c): 49被筛选后的状态 (d): 56被筛选后的状态 (e): 被筛选之后建成堆
将堆顶元素与最后一个元素
(2) 输出堆顶元素并交调换整,建然新后堆对的前过n程-1(个筛元选素)
{ r[0]=r[i]; r[i]=r[k]; r[k]=r[0]; }
} for(i=1;i<=LENGTH;i++)
/*输出排序后的序列*/
printf("%d ",r[i]);
}
8.3 选择排序
数据结构
简单选择排序算法简单,但是速度较慢,时间复杂度 为O(n2),并且是一种不稳定的排序方法。
数据结构第8章排序.
插入排序的基Leabharlann Baidu思想:
从数组的第2号元素开始, 顺序从数组中取出元素,并将 该元素插入到其左端已排好序 的数组的适当位置上
8.2.1 直接插入排序 基本思想:当插入第i (i 1) 个对象 时,前面的v[0], v[1], …, v[i-1]已经 排好序。这时,用v[i]的关键字与v[i1], v[i-2], …的关键码顺序进行比较, 找到插入位置即将v[i]插入,原来位 置上的对象向后顺移。
第8章 排序
8.1 排序基本概念 8.2 插入类排序 8.3 交换类排序 8.4 选择类排序 8.5 归并排序 8.6 基数排序 8.7 各类排序方法的比较 8.8 外部排序
8. 1 排序基本概念
排序:
将一组杂乱无章的数据元素(记录) 按关键字升
序(或降序)重新排列的过程
1. 内排序与外排序: 内排序:在排序期间数据对象全部存 放在内存的排序;
直接插入类排序分析
平均时间复杂度:O(n2) 稳定性:稳定的排序方法
待排元素序列:[53] 27 36 15 69 36 第一次排序: 第二次排序: 第三次排序: 第四次排序: 第五次排序: [27 53] 36 15 69 36 [27 36 53] 15 69 36 [15 27 36 53] 69 36 [15 27 36 [15 27 36 53 69] 36 36 53 69]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验八内部排序
一、实验目的
1、掌握内部排序的基本算法;
2、分析比较内部排序算法的效率。
二、实验内容和要求
1. 运行下面程序:
#include
#include
#define MAX 50
int slist[MAX]; /*待排序序列*/
void insertSort(int list[], int n);
void createList(int list[], int *n);
void printList(int list[], int n);
void heapAdjust(int list[], int u, int v);
void heapSort(int list[], int n);
/*直接插入排序*/
void insertSort(int list[], int n)
{
int i = 0, j = 0, node = 0, count = 1;
printf("对序列进行直接插入排序:\n");
printf("初始序列为:\n");
printList(list, n);
for(i = 1; i < n; i++)
{
node = list[i];
j = i - 1;
while(j >= 0 && node < list[j])
{
list[j+1] = list[j];
--j;
}
list[j+1] = node;
printf("第%d次排序结果:\n", count++);
printList(list, n);
}
}
/*堆排序*/
void heapAdjust(int list[], int u, int v)
{
int i = u, j = 0, temp = list[i];
if(u == 0) /*判断数组下标,确定list[u]的左孩子的下标*/ {
j = 1;
}
else
{
j = 2 * i;
}
while (j <= v)
{
if(j < v && list[j] < list[j+1])
{
j++; /*若右孩子较大,则把j修改为右孩子的下标*/ }
if(temp < list[j])
{
list[i] = list[j]; /*将list[j]调到父亲的位置上*/
i = j;
j = 2 * i; /*修改i和j的值,以便继续向下筛选*/ }
else
break; /*筛选完成,终止循环*/
}
list[i] = temp; /*被筛结点的值放入最终位置*/
}
void heapSort(int list[], int n)
{
int i = 0, temp = 0, count = 1;
printf("对序列进行堆排序:\n");
printf("初始序列为:\n");
printList(list, n);
for (i = (n - 1) / 2; i >= 0; i--)
{
heapAdjust(list, i, n-1); /*建立初始堆*/
}
printf("建立的初始堆为:\n");
printList(list, n);
for(i = n - 1; i >= 1; i--)
{
/*循环,完成堆排序*/
temp = list[0];
list[0] = list[i];
list[i] = temp; /*将第一个元素同当前区间内最后一个元素对换*/
heapAdjust(list, 0 , i-1); /*筛选出list[1]结点*/
printf("第%d次排序结果:\n", count++);
printList(list, n);
}
}
/*生成待排序序列*/
void createList(int list[], int *n)
{
int i = 0,a;
printf("请输入待排序序列(长度小于50,以输入一个字符结束):\n"); while(scanf("%d",&a)==1)
{
list[i] = a;
i++;
}
*n=i;
getchar();
}
/*输出排序结果*/
void printList(int list[], int n)
{
int i = 0;
for(; i < n; i++)
{
printf(" %d ", list[i]);
if(i % 10 ==0 && i != 0)
{
printf("\n");
}
}
printf("\n");
}
int main()
{
int choice=1,length;
while(choice!=0)
{
printf("\n");
printf("***** 内部排序算法演示程序 *****\n");
printf("\n1. 直接插入排序 \n");
printf("\n2. 堆排序 \n");
printf("\n0. 退出\n");