本章思维导图:
数据结构(第八章) - 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);//重建堆
}
}