数据结构(第八章):排序技术

本章思维导图:

数据结构(第八章) - GitMind 我使用GitMind制作了一份思维导图,快来看看https://gitmind.cn/app/doc/ec44670947


总代码:
代码1

#include<iostream>
#include<fstream>
using namespace std;
class Sort
{
public:
	Sort(int r[], int n);//构造函数,生成待排序序列
	~Sort();//析构函数
	void InsertSort();//直接插入排序
	void ShellSort();//希尔排序
	void BubbleSort();//起泡排序
	void QuickSort(int first,int last);//快速排序
	void SelectSort();//简单选择排序
	void HeapSort();//堆排序
	void MergeSort1(int first, int last);//二路归并递归排序
	void MergeSort2();//二路归并非递归排序
	void Print();//输出序列
private:
	int Partition(int first, int last);//快速排序,一次划分
	void Sift(int k, int last);//堆排序,堆调整
	void Merge(int first1, int last1, int last2);//归并排序,合并相邻有序序列
	void MergePass(int h);//归并排序,一趟归并
	int* data;
	int length;
};
Sort::Sort(int r[], int n)
{
	data = new int[n];
	for (int i = 0;i < n;i++)
		data[i] = r[i];
	length = n;
}
Sort::~Sort()
{
	delete[]data;
};
void Sort::Print()
{
	for (int i = 0;i < length;i++)
	{
		cout << data[i] << "/t";
		cout << endl;
	}
}

代码2

void Sort::InsertSort()
{
	int i, j, temp;
	for (i = 1;i < length;i++)//排序进行length-1趟
	{
		temp = data[i];//暂存待插记录
		for (j = i - 1;j >= 0 && temp < data[j];j--)//寻找插入位置
			data[j + 1] = data[j];
		data[j + 1] = temp;
	}
}

代码3

void Sort::ShellSort()//希尔排序
{
	int d, i, j, temp;
	for (d = length / 2;d >= 1;d = d / 2)//增量为d,在每个子序列中进行直接插入排序
	{
		for (i = d;i < length;i++)//进行一趟希尔排序
		{
			temp = data[i];//暂存待插记录
			for (j = i - d;j >= 0 && temp < data[j];j = j - d)
				data[j + d] = data[j];//记录后移d个位置
			data[j + d] = temp;
		}
	}
}

代码4

void Sort::BubbleSort()//起泡排序
{
	int j, exchange, bound, temp;
	exchange = length - 1;//第一趟起泡排序的区间是[0~length-1]
	while (exchange != 0)
	{
		bound = exchange;
		exchange = 0;
		for (j = 0;j < bound;j++)//一趟起泡排序的区间是[0~bound]
			if (data[j] > data[j + 1])
				temp = data[j];
		data[j] = data[j + 1];
		data[j + 1] = temp;
		exchange = j;//记载每一次记录交换的位置
	}
}

代码5

int Sort::QuickSort(int first, int last)//快速排序
{
	int i = first, j = last, temp;
	while (i < j)
	{
		while (i < j && data[i] <= data[j])j--;//右侧扫描
		if (i < j)
		{
			temp = data[i];
			data[i] = data[j];
			data[j] = temp;
			i++;
		}
		while (i < j && data[i] <= data[j])i++;//左侧扫描
		if (i < j)
		{
			temp = data[i];data[i] = data[j];data[j] = temp;
			j--;
		}
	}
	return i;//i为轴值记录的最终值
}

代码6

void Sort::SelectSort()//简单选择排序
{
	int i, j, index, temp;
	for (i = 0;i < length - 1;i++)//进行length趟简单选择排序
	{
		index = i;
		for (j = i + 1;j < length;j++)//在无序区中选取最小的记录
			if (data[j] < data[index])
				index = j;
		if (index != i)
		{
			temp = data[i];
			data[i] = data[index];
			data[index] = temp;
		}
	}
}

代码7

void Sort::Sift(int k, int last)//堆调整
{
	int i, j, temp;
	i = k;j = 2 * i + 1;//i为被调整的节点,j是i的左孩子(第一个结点记为data[0]如果是data[1]则会有不同的对应关系
	while (j<=last)//还没有进行到叶子
	{
		if (j < last && data[j] < data[j + 1])//j指向左右孩子的较大者
			j++;
		if (data[i] > data[j])break;//已经是堆
		else
		{
			temp = data[i];
			data[i] = data[j];
			data[j] = temp;
			i = j;
			j = 2 * i + 1;//被调整结点位于结点j的位置
		}
	}
}
void Sort::HeapSort()//堆排序
{
	int i, temp;
	for (i = ceil(length / 2) - 1;i >= 0;i--)
		//从最后一个分支结点到根节点调整
		Sift(i, length - 1);
	for (i = 1;i < length;i++)
	{
		temp = data[0];
		data[0] = data[length - i];
		data[length - i] = temp;
		Sift(0, length - i - 1);//重建堆
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值