数据结构实验(七种排序算法的实现)题目和源程序

  • 格式:docx
  • 大小:20.67 KB
  • 文档页数:8

下载文档原格式

  / 8
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、直接插入排序

2、希尔排序

3、2-路归并排序

4、折半插入排序

5、冒泡排序

6、快速排序

7、堆排序

/*----------------------------------------

* 07_排序.cpp -- 排序的相关操作

* 对排序的每个基本操作都用单独的函数来实现

* 水上飘2011年写

----------------------------------------*/

// ds07.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include "stdio.h"

#include

#include

using namespace std;

#define MAXSIZE 20

typedefintKeyType;

typedefstruct{

KeyType key; //关键字项

KeyType data; //数据项

}RedType; //记录类型

typedefstruct{

RedTypearr[MAXSIZE+1]; //arr[0]闲置或用作哨兵单元int length; //顺序表长度

}SqList; //顺序表类型typedefSqListHeapType;

//对顺序表L做一趟希尔插入排序

//前后记录位置的增量是dk

//r[0]只是暂存单元

//当j<=0时,插入位置已找到

voidshellInsert(SqList&L, intdk)

{

int i, j;

for (i = dk + 1; i <= L.length; i++)

{

if (L.arr[i].key

{

L.arr[0] = L.arr[i]; //暂存

for (j = i - dk; j > 0 &&L.arr[0].key

{

L.arr[j + dk] = L.arr[j]; //记录后移,查找插入位置}//end for j

L.arr[j + dk] = L.arr[0]; //插入

}//end if

}//end for i

}//shellInsert

//按增量序列dlta[0...t-1]对顺序表做希尔排序

voidshellSort(SqList&L, intdlta[], int t)

{

for (int k = 0;k < t; k++)

{

shellInsert(L, dlta[k]); //一趟增量为dlta[k]的插入序列}

}

//折半插入排序

voidbInsertSort(SqList&L)

{

for (int i = 2; i <= L.length; i++){

L.arr[0] = L.arr[i];//将其暂存到arr[0]

int low = 1;

int high = i - 1;

while(low <= high){//在arr[low...high]中折半查找有序插入的位置int m = (low + high) / 2;//折半

if(L.arr[0].key

high = m - 1;//插入点在低半区

else low = m + 1;//插入点在高半区

}//while

for(int j = i - 1; j >= high + 1; j--)

L.arr[j + 1] = L.arr[j];//记录后移

L.arr[high + 1] = L.arr[0];//插入

}//for

}//BInsertSort

//直接插入排序

voidinsertSort(SqList&L)

{

for(int i = 2; i <= L.length; i++){

if(L.arr[i].key

L.arr[i] = L.arr[i-1];

int j;

for(j = i - 2; L.arr[0].key

L.arr[j+1] = L.arr[j];//记录后移

L.arr[j+1] = L.arr[0];//插入到正确位置

}//if

}//for

}//InsertSort

//冒泡排序

voidbubbleSort(SqList&L)

{

RedType* temp = NULL;

for(int i = 1; i

for(int j = 1; j <= L.length-i; j++){//第j次排序

if(L.arr[j].key >L.arr[j+1].key){

//交换前后的位置

L.arr[0] = L.arr[j];

L.arr[j] = L.arr[j+1];

L.arr[j+1] = L.arr[0];

}//if

}//for j

}//for i

}//bubbleSort

//交换顺序表中子表L.arr[low...high]的记录,

//枢轴记录到位,并返回其所在位置

int partition(SqList&L, int low, int high)

{

L.arr[0] = L.arr[low];//子表的第一个记录做枢轴记录

KeyTypepivotKey = L.arr[low].key;//枢轴记录关键字

while(low < high){//从表的两端交替向中间扫描

while(low < high &&L.arr[high].key >= pivotKey){

high--;

}//while

L.arr[low] = L.arr[high];//将比枢轴小的记录移到低端

while(low < high &&L.arr[low].key <= pivotKey){

low++;

}//while