排序算法的分析和应用

本文详细介绍了几种主要的排序算法,包括希尔排序的参数设定及每轮状态,堆排序的建堆过程和每轮状态,快速排序的划分与递归策略,基数排序的链表处理和状态,以及外部排序中多路归并排序的3叉和4叉哈夫曼树构建与最佳归并策略。
摘要由CSDN通过智能技术生成

 

目录

希尔排序

自己设计一个长度不小于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路归并的最佳归并策略

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值