数据结构-排序算法实践

数据结构-排序算法实践

简单插入排序

#include<iostream>
#include<malloc.h>
using namespace std;
#define MAXSIZE 50 
// 定义顺序表结构
typedef struct {
   
	int r[MAXSIZE + 1];  //r[0]闲置或用作哨兵单元
	int length;  // 顺序表长度
}SqList;

/** * 对顺序表L作直接插入排序 * @param L 顺序表L */
void InsertSort(SqList& L) {
   
	int i, j;
	for (i = 2; i <= L.length; i++)
	{
   
		if (L.r[i] < L.r[i - 1]) {
     // "<",则需将L.r[i]插入有序表
			L.r[0] = L.r[i];  // 复制为哨兵
			L.r[i] = L.r[i - 1];  // 第i个<第i-1个,先交换一次
			for (j = i - 2; L.r[0] < L.r[j]; --j)  // 再从第i-2个开始往前比较
				L.r[j + 1] = L.r[j];  //记录后移
			L.r[j + 1] = L.r[0];  // 插入到正确位置
		}
	}
}

/** * 输出顺序表 * @param L 顺序表L */
void Print_SqList(SqList L) {
   
	for (int i = 1; i <= L.length; i++)
		cout << L.r[i] << " ";
	cout << endl;
}

int main() {
   
	int n;
	int r[MAXSIZE + 1];
	cin >> n;
	SqList L;
	for (int i = 1; i <= n; i++)
	{
   
		cin >> L.r[i];
	}
	L.length = n;

	cout << "插入排序:";
	InsertSort(L);
	Print_SqList(L);
	
	return 0;
}

冒泡排序

#include<iostream>
#include<malloc.h>
using namespace std;
#define MAXSIZE 50 
// 定义顺序表结构
typedef struct {
   
	int r[MAXSIZE + 1];  //r[0]闲置或用作哨兵单元
	int length;  // 顺序表长度
}SqList;

/** * 最顺序表L作冒泡排序 * @param L 顺序表L */
void BubbleSort(SqList& L) {
   
	for (int i = 1; i < L.length; i++)
	{
   
		bool flag = false;  // 是否发生交换的标志
		for (int j = L.length; j > i; j--)  // 一趟冒泡
		{
   
			if (L.r[j - 1] > L.r[j]) {
     // 逆序则交换
				swap(L.r[j - 1], L.r[j]);  // C++中提供的交换函数
				flag = true;
			}
		}
		if (!flag)
			break;  //一趟冒泡没有发生交换,说明表已有序
	}
}

/** * 输出顺序表 * @param L 顺序表L */
void Print_SqList(SqList L) {
   
	for (int i = 1; i <= L.length; i++)
		cout << L.r[i] << " ";
	cout << endl;
}

int main() {
   
	int n;
	int r[MAXSIZE + 1];
	cin >> n;
	SqList L;
	for (int i = 1; i <= n; i++)
	{
   
		cin >> L.r[i];
	}
	L.length = n;

	cout << "冒泡排序:";
	BubbleSort(L);
	Print_SqList(L);
	
	return 0;
}

快速排序

#include<iostream>
#include<malloc.h>
using namespace std;
#define MAXSIZE 50 
// 定义顺序表结构
typedef struct {
   
	int r[MAXSIZE + 1];  //r[0]闲置或用作哨兵单元
	int length;  // 顺序表长度
}SqList;

/** * 交换顺序表L中子表r[low..high]的记录,枢轴记录到位,并返回其所在位 * 置,此时在它之前(后)的记录均不大(小)于它 * @param L 顺序表L * @param low 起始位置 * @param high 结束位置 * @return 返回枢轴位置 */
int Partition(SqList& L, int low, int high) {
   
	L.r[0] = L.r[low];  // 用子表的第一个记录作枢轴记录
	int pivotkey = L.r[low];  // 枢轴记录关键字
	while (low < high) {
     // 从表的两端交替地向中间扫描
		while (low < high && L.r[high] >= pivotkey)
			--high;
		L.r[low] = L.r[high];  // 将比枢轴记录小的记录移到低端
		while (low < high && L.r[low] <= pivotkey)
			++low;
		L.r[high] = L.r[low];  // 将比枢轴记录大的记录移到高端
	}
	L.r[low] = L.r[0];  // 枢轴记录到位
	return low;  // 返回枢轴位置
}
/** * 对顺序表L中的子序列L.r[low..high]作快速排序 * @param L 顺序表L * @param low 起始位置 * @param high 结束位置 */
void Qsort(SqList& L, int low, int high) {
   
	if (low < high) {
     // 长度大于1
		int pivotloc = Partition(L, low, high);  // 将L.r[low..high]一分为二
		Qsort(L, low, pivotloc - 1);  // 对低子表递归排序,piovtloc是枢轴位置
		Qsort(L, pivotloc + 1, high);  // 对高子表递归排序
	}
}
/** * 对顺序表L作快速排序 * @param L 顺序表L */
void QuickSort(SqList& L) {
   
	Qsort(L, 1, L.length);
}
/** * 输出顺序表 * @param L 顺序表L */
void Print_SqList(SqList L) {
   
	for (int i = 1; i <= L.length; i++)
		cout << L.r[i] << " ";
	cout << endl;
}

int main() {
   
	int n;
	int r[MAXSIZE + 1];
	cin >> n;
	SqList L;
	for (int i = 1; i <= n; i++)
	{
   
		cin >> L.r[i];
	}
	L.length = n;

	cout << "快速排序:";
	QuickSort(L);
	Print_SqList(L);
	
	return 0;
}

归并排序

#include<iostream>
#include<malloc.h>
using namespace std;
#define MAXSIZE 50 
// 定义顺序表结构
typedef struct {
   
	int r[MAXSIZE + 1];  //r[0]闲置或用作哨兵单元
	int length;  // 顺序表长度
}SqList;

int B[MAXSIZE];  // 辅助数组B
/** * 表A的两端A[low..mid]和A[mid+1..high]各自有序,将它们合并成一个有序表 * @param A 数组A * @param low 起始位置 * @param mid 中间位置 * @param high 结束位置 */
void Merge(int A[], int low, int mid, int high) {
   
	int i, j, k;
	for (k = low; k <= high; k++)
		B[k] = A[k];  // 将A中的所有元素赋值到B中
	for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++) {
   
		if (B[i] <= B[j])  // 比较B的左右两段中的元素,将较小值复制到A中
			A[k] = B[i++];
		else
			A[k] = B[j++];
	}
	while (i <= mid)  // 若第一个表未检测完,直接复制后面的
		A[k++] = B[i++];
	while (j <= high)  // 若第二个表未检测完,直接复制后面的
		A[k++] = B[j++];
}
/** * 对表A作归并排序 * @param A 表A * @param low 起始位置 * @param high 结束位置 */
void MergeSort(int A[], int low, int high) {
   
	if (low < high) {
   
		int mid = (low + high) / 2;  // 从中间划分为两个子序列
		MergeSort(A, low, mid);  // 对左侧子序列进行递归排序
		MergeSort(A, mid + 1, high);  // 对右侧子序列进行递归排序
		Merge(A, low, mid, high);  // 归并
	}
}

/** * 输出顺序表 * @param L 顺序表L */
void Print_SqList(SqList L) {
   
	for (int i = 1; i <= L.length; i++)
		cout << L.r[i] << " ";
	cout << endl;
}

int main() {
   
	int n;
	int r[MAXSIZE + 1];
	cin >> n;
	SqList L;
	for (int i = 1; i <= n; i++)
	{
   
		cin >> L.r[i];
	}
	L.length = n;

	cout << "归并排序:";
	MergeSort(L.r, 1, L.length);
	Print_SqList(L);
	
	return 0;
}

堆排序

#include<iostream>
#include<malloc.h>
using namespace std;
#define MAXSIZE 50 
// 定义顺序表结构
typedef struct {
   
	int r[MAXSIZE + 1];  //r[0]闲置或用作哨兵单元
	int length;  // 顺序表长度
}SqList;

/** * 对顺序表H进行调整为大顶堆,H.r[s..m]中记录的关键字均满足堆的定义 * @param H 顺序表H * @param s 起始位置 * @param m 结束位置 */
void HeapAdjust(SqList& H, int s, int m) {
   
	int rc = H.r[s];
	for (int j = 2 * s; j <= m; j *= 2) {
     // 沿关键字值较大的孩子结点向下筛选
		if (j < m&& H.r[j] < H.r[j + 1])  // j为关键字值较大的记录的下标
			++j;
		if (rc >= H.r[j])  // rc应插入在位置s上
			break;
		H.r[s] = H.r[j];
		s = j;
	}
	H.r[s] = rc;  // 插入
}
/** * 对顺序表H进行堆排序 * @param H [description] */
void HeapSort(SqList& H) {
   
	for (int i = H.length / 2; i > 0; --i)  // 把H.r[1..H.length]建成大顶堆
		HeapAdjust(H, i, H.length);
	for (int j = H.length; j > 1; --j) {
   
		swap(H.r[1], H.r[j]);  // 将堆顶记录和当前未经排序子序列H.r[i..i]中最后一个记录相互交换
		HeapAdjust(H, 1, j - 1);  // 将H.r[1..j-1]重新调整为大顶堆
	}
}

/** * 输出顺序表 * @param L 顺序表L */
void Print_SqList(SqList L) {
   
	for (int i = 1; i <= L.length; i++)
		cout << L.r[i] << " ";
	cout << endl;
}

int main() {
   
	int n;
	int r[MAXSIZE + 1];
	cin >> n;
	SqList L;
	for (int i = 1; i <= n; i++)
	{
   
		cin >> L.r[i];
	}
	L.length = n;

	cout << "堆排序:";
	HeapSort(L);
	Print_SqList(L);
	
	return 0;
}

创作不易,喜欢的话加个关注点个赞,谢谢谢谢谢谢!

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-20 19:57
已编辑
某大厂 golang工程师 23.0k*16.0, 2k房补,年终大概率能拿到
点赞 评论 收藏
分享
在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
牛客101244697号:这个衣服和发型不去投偶像练习生?
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务