数据结构实验八内部排序

合集下载

数据结构实验八 排序

数据结构实验八 排序

实验八排序

一、实验目的

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++

内部排序比较  (实验报告+源程序)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 内排序

实验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排序

数据结构实验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 查找与排序

数据结构实验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

数据结构:第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的直接插入排序 } }
内部排序方法大致可分下列几种类 型:

数据结构第八章 排序

数据结构第八章 排序
建堆时是从最后一个非终端结点 n/2 开始的。
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章排序.

数据结构第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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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");

相关文档
最新文档