本科课程【数据结构与算法】实验7 - 快速排序、折半查找

x33g5p2x  于2022-03-31 转载在 其他  
字(3.4k)|赞(0)|评价(0)|浏览(331)

大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。
如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!!
Good better best, never let it rest, until good is better, and better best.

近期会把自己本科阶段的一些课程设计、实验报告等分享出来,供大家参考,希望对大家有帮助。

博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html

一、 实验目的

  1. 实现快速排序算法
  2. 实现折半查找算法

二、 实验内容

1. 实验任务

(1)输入一个数组,将数组元素用快速排序输出
(2)输入一个目标数据,从已知链表中用折半查找查出目标数据的位置

2. 程序设计

1) 数据输入(输入哪些数据、个数、类型、来源、输入方式)
输入n个需要排序的数据(int 整型)

输入待查找的目标数据key(int 整型)

2) 数据存储(输入数据在内存中的存储)
n个数据都存储在数组Array[i]中

以链表的形式存储数据,采用动态分配内存并释放

3) 数据处理(说明处理步骤。若不是非常简单,需要绘制流程图)
(1)
①先从数列中取出一个数为准基数
②分区过程,将比这个数大的数全部放在他的右边,小于或等于它的数全部放在左边
③再对左右区间重复第二步,直到各区间只有一个数

(2)
①将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;
②否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表;
③重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

4) 数据输出

三、 实验环境

  1. 操作系统:WINDOWS 10
  2. 开发工具:VC++ 2013
  3. 实验设备:PC

源代码(C++实现)

快速排序

#include<iostream>
using namespace std;

void QuickSort(int Array[], int left, int right);
int main()
{
	int array[] = { 3, 21, 87, 1, 21, 10 };
	cout << "排序前数列为:";
	for (int i = 0; i < 6; i++)
	{
		cout<< array[i]<<" ";
	}
	cout << endl;
	QuickSort(array, 0, 5);
	cout << "快速排序后为:";
	for (int i = 0; i < 6; i++)
	{
		cout << array[i]<<" ";
	}
	cout << endl;
	system("pause");
	return 0;
}

void QuickSort(int Array[], int left, int right)
{
	if (left >= right)
	{
		return;
	}

	int first = Array[left];
	int leftIndex = left, rightIndex = right;
	while (leftIndex < rightIndex)
	{
		while (leftIndex < rightIndex)
		{
			if (first <= Array[rightIndex])
			{
				rightIndex--;
			}
			else
			{
				Array[leftIndex] = Array[rightIndex];
				leftIndex++;
				break;
			}
		}
		while (leftIndex < rightIndex)
		{
			if (first >= Array[leftIndex])
			{
				leftIndex++;
			}
			else
			{
				Array[rightIndex] = Array[leftIndex];
				rightIndex--;
				break;
			}
		}
	}
	Array[leftIndex] = first;

	QuickSort(Array, left, leftIndex - 1);
	QuickSort(Array, rightIndex + 1, right);
}

折半查找

#include<iostream>
using namespace std;

// 线性表中的元素
typedef int KeyType;
typedef struct ElemType {
	KeyType key;	// 主关键字
	// 省略其他数据,不再定义
}ElemType;

// 线性表的顺序存储结构
typedef struct SeqTable {
	ElemType* elem;	// 数据元素存储空间基址,建表时按实际长度分配,
	// 0 号单元留空,从 1 号单元开始使用。
	int length;		// 表长度
}SeqTable;

//
// 在此处声明函数
//

int BinarySearch(SeqTable* pST, KeyType key);
void InitSeqTable(SeqTable* pST);
void DeleteSeqTable(SeqTable* pST);
int main()
{
	KeyType n,m;
	SeqTable ST;	// 线性表

	//
	// 初始化线性表
	//
	InitSeqTable(&ST);
	cout << "初始线性表为:";
	for (int i = 1; i <= ST.length; i++)
	{
		cout << ST.elem[i].key << " ";
	}
	cout << endl;
	cout << "输入要查找的元素:";
	cin >> n;
	//
	// 折半查找
	//
	m=BinarySearch(&ST, n);
	cout << n << "位于链表的第" << m << "位" << endl;
	//
	// 销毁线性表
	//
	DeleteSeqTable(&ST);

	system("pause");
	return 0;
}

/*
功能:
折半查找。

参数:
pST -- 线性表指针
key -- 查找关键字

返回值:
如果查找成功返回关键字在表中的位置
如果查找失败返回 0
*/
int BinarySearch(SeqTable* pST, KeyType key)
{
	int low = 1;
	int high = pST->length;
	int mid;

	while (low < high)
	{
		mid = (low + high) / 2;
		if (pST->elem[mid].key == key)
		{
			return mid;
			break;
		}
		else if (pST->elem[mid].key>key)
		{
			high = mid - 1;
		}
		else
		{
			low = mid + 1;
		}
	}

}

/*
功能:
初始化线性表。

参数:
pST -- 线性表指针
*/
//                  1, 2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12
int InitArray[] = { 2, 4, 11, 18, 25, 32, 39, 46, 53, 60, 67, 74 };	// 顺序必须为从小到大
void InitSeqTable(SeqTable* pST)
{
	int i;

	pST->length = sizeof(InitArray) / sizeof(InitArray[0]);
	pST->elem = (ElemType*)malloc((pST->length + 1) * sizeof(ElemType));	// 因为单元 0 留空,所以长度必须加 1

	for (i = 1; i <= pST->length; i++)
		pST->elem[i].key = InitArray[i - 1];
}

/*
功能:
销毁线性表。

参数:
pST -- 线性表指针
*/
void DeleteSeqTable(SeqTable* pST)
{
	free(pST->elem);

	pST->elem = NULL;
	pST->length = 0;
}

博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html

相关文章