奇偶交换排序

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

数据结构上机实验报告题目:奇偶交换排序

学生姓名

学生学号

学院名称计算机学院

专业计算机科学与技术

时间 2015.01.13

目录

第一章需求分析 (1)

1.1 原题表述 (1)

1.2 问题解决方案 (1)

第二章概要设计 (2)

2.1 抽象数据类型 (2)

2.2 主要算法描述 (2)

2.3 主要算法分析 (3)

第三章详细设计 (4)

3.1 程序代码 (4)

第四章调试分析 (6)

4.1 出现的问题及解决方法 (6)

第五章测试分析 (7)

5.1 测试样例 (7)

第一章需求分析

1.1原题表述

奇偶交换排序是另一种交换排序。算法的基本思想如下:排序过程通过对文件x[i](l≤i≤n)的若干次扫描来完成,第奇数次扫描,对所有下标为奇数的记录x[i]与其后面的记录x[i+1](l≤i≤n–1)相比较,若x[i].KEY(记录x[i]的key值)>x[i+1].KEY,则交换x[i]和x[i+1]的内容;

第偶数次扫描,对所有下标为偶数的记录x[i]与其后面的记录x[i+1](2≤i≤n–1)相比较,若x[i].KEY>x[i+1].KEY,则交换x[i]和x[i+1]之内容。一趟奇数次扫描和一趟偶数次扫描被称为一趟奇偶扫描。重复上述过

程直到排序完成为止。

设计奇偶排序函数,对于任意输入元素,输出排序过程。

1.2 问题解决方案

题目需要建立建立一种新的排序方式,奇数趟对数组中的所有奇数项扫描,偶数趟对序列中的所有偶数项扫描。若A[i] > A[i+1],则交换它们。

如此反复,最后得出排好的序列为止,最后的终止条件是进行一趟排序对比时,不在出现A[i] > A[i+1]的情况

第二章概要设计2.1 抽象数据类型

2.2 主要算法描述

int OddEvenSort(int s[], int n)

{

int i, exchange = 1, temp, num = 0;

while(exchange != 0)//;do

{

exchange = 0;

//扫描所有奇数项

for(i = 1; i < n - 1; i += 2)

{

//相邻两相比较,发生逆序

if(s[i] > s[i+1])

{

exchange = 1;//做交换标记

//交换

temp = s[i];

s[i] = s[i+1];

s[i+1] = temp;

}

}

if(exchange)

{

num++;

exchange = 0;

for(int w = 0; w < n; w++)

printf("%d ", s[w]);

printf("\n");

}

for(i = 0; i < n - 1; i += 2)

{

//相邻两相比较,发生逆序

if(s[i] > s[i+1])

{

exchange = 1;//做交换标记

//交换

temp = s[i];

s[i] = s[i+1];

s[i+1] = temp;

}

}

if(exchange)

{

num++;

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

printf("%d ", s[t]);

printf("\n");

}

}//while(exchange != 0);

return num;

}

2.3 主要算法分析

OddEvenSort (int s[], int n)的时间复杂度为O(n2);

第三章详细设计3.1 程序代码

#include

int OddEvenSort(int s[], int n)

{

int i, exchange = 1, temp, num = 0;

while(exchange != 0)//;do

{

exchange = 0;

//扫描所有奇数项

for(i = 1; i < n - 1; i += 2)

{

//相邻两相比较,发生逆序

if(s[i] > s[i+1])

{

exchange = 1;//做交换标记

//交换

temp = s[i];

s[i] = s[i+1];

s[i+1] = temp;

}

}

if(exchange)

{

num++;

exchange = 0;

for(int w = 0; w < n; w++)

printf("%d ", s[w]);

printf("\n");

}

for(i = 0; i < n - 1; i += 2)

{

//相邻两相比较,发生逆序

if(s[i] > s[i+1])

{

exchange = 1;//做交换标记

//交换

temp = s[i];

s[i] = s[i+1];

s[i+1] = temp;

相关文档
最新文档