目录
自己设计一个长度不小于10的乱序数组,用希尔排序,自己设定希尔排序参数
自己设计一个长度不小于10的乱序数组,用堆排序,最终要生成升序数组,画出建堆后的状态
自己设计一个长度不小于10的乱序数组,用快速排序,最终要生成升序数组
自己设计一个长度不小于15的乱序链表,每个数据元素取值范围0~99,用基数排序,最终要生成升序链表
自己设计一个多路归并排序(外部排序)的例子:初始有不少于10个归并段,每个归并段长度不同
利用初始归并段构造3叉哈夫曼树,并画出3路归并的最佳归并策略
利用初始归并段构造4叉哈夫曼树,并画出4路归并的最佳归并策略
希尔排序
自己设计一个长度不小于10的乱序数组,用希尔排序,自己设定希尔排序参数
画出每一轮希尔排序的状态
(52条消息) 【考研】数据结构考点——希尔排序_数据结构希尔排序_住在阳光的心里的博客-CSDN博客
堆排序
自己设计一个长度不小于10的乱序数组,用堆排序,最终要生成升序数组,画出建堆后的状态
(52条消息) 【考研】数据结构考点——堆排序(含408真题)_堆排序例题讲解_住在阳光的心里的博客-CSDN博客
据题目要求,升序数组即要求小根堆
代码略
画出每一轮堆排序的状态
以上只是的一轮的创建过程
第二轮删除根节点,并用堆底代替,然后重复下坠调整
每次删除的元素加入数组序列得到有序序列{1,2,3,5,6,9,10}
快速排序
自己设计一个长度不小于10的乱序数组,用快速排序,最终要生成升序数组
画出每一轮快速排序的状态
快速排序 =
划分
+ 递归枢轴元素:pivot
通常选择顺序表第一个元素,用于划分顺序表为两部分,左边部分值小于枢轴,右边部分值大于枢轴
算法步骤:
1. 确定枢轴pivot,并用一个新变量存储:int pivot = A[low]
2. high: 依次从后往前扫描,如果 元素值 A[high] < pivot,则 A[low] = A[high],否则high--
3. low: 依次从前往后扫描,如果 元素值 A[low] > pivot,则 A[high] = A[low],否则low++
算法实现
int Partition(int A[], int low, int high) {
int pivot = A[low];
while (low < high) {
while (low < high && A[high] >= pivot) {
high--;
}
A[low] = A[high]; // 比枢轴元素小的元素移动到左端
while (low < high && A[low] <= pivot) {
low++;
}
A[high] = A[low]; // 比枢轴元素大的元素移动到右端
}
A[low] = pivot; // 枢轴元素放到最终位置
return low; // 枢轴元素的最终位置,左边元素小于枢轴元素,右边元素大于枢轴元素
}
void QuickSort(int A[], int low, int high) {
if (low < high) {
int pivotPos = Partition(A, low, high); // 进行一次划分
QuickSort(A, low, pivotPos - 1); // 递归划分左边部分
QuickSort(A, pivotPos + 1, high); // 递归划分右边部分
}
}
第一轮
基数排序
自己设计一个长度不小于15的乱序链表,每个数据元素取值范围0~99,用基数排序,最终要生成升序链表
画出每一轮基数排序的状态
代码能力强的同学,尝试实现上述基数排序的相关代码
两位数“两趟”就可得有序序列
外部排序(多路归并排序)
自己设计一个多路归并排序(外部排序)的例子:初始有不少于10个归并段,每个归并段长度不同
利用初始归并段构造3叉哈夫曼树,并画出3路归并的最佳归并策略
设初始归并段个数n=12,外归并路数k = 3,计算(n-1)%(k-1) = 11%2 = 1 不等于 0,说明不能做完全的4路归并,因为多出了1个初始归并段,必须添加 k-1-1 = 1个长度为0的空归并段,才能构成严格的3路归并树,即每次归并都有k个归并段参加归并
此时,归并树的内节点应有(n-1 + 1)/(k-1)=12/2 = 6 个,如下图所示。
WPL = (0 + 3 + 6)*4 + (8 + 9 +18 +20 +30)*3 +(68 + 44 + 60 + 62)*2 + 85*1 = 36+255+468+85=844
利用初始归并段构造4叉哈夫曼树,并画出4路归并的最佳归并策略