所有栏目

c语言堆排序方法及优缺点

已输入 0 字
优质回答
  • 一、冒泡排序 已知一组无序数据a、a、……a[n],需将其按升序排列。

    首先比较a与 a的值,若a大于a则交换 两者的值,否则不变。

    再比较a与a的值,若a大于a则交换两者的值,否则不变。

    再比 较a与a,以此 类推,最后比较a[n-1]与a[n]的值。

    这样处理一轮后,a[n]的值一定是这组数据中最大的。

    再对a~a[n- 1]以相同方法 处理一轮,则a[n-1]的值一定是a~a[n-1]中最大的。

    再对a~a[n-2]以相同方法处理一轮,以此类推。共处理 n-1 轮 后a、a、……a[n]就以升序排列了。

    优点:稳定;

    缺点:慢,每次只能移动相邻两个数据。 二、选择排序 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数 据元素排完。

    选择排序是不稳定的排序方法。 n 个记录的文件的直接选择排序可经过n-1 趟直接选择排序得到有序结果:

    ①初始状态:无序区为R[1..n],有序区为空。

    ②第1 趟排序 在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1 个记录R交换,使R[1..1]和R[2..n]分别变 为记录个数增加1 个的新有序区和记录个数减少1 个的新无序区。

    ③第i 趟排序 第i 趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n-1)。

    该趟 排序从当前无序区中选出关键字最 小的记录 R[k],将它与无序区的第1 个记录R 交换,使R[1..i]和R 分别变为记录个数增加1 个的新有序区和记录个数减少 1 个的新无序区。

    这样,n 个记录的文件的直接选择排序可经过n-1 趟直接选择排序得到有序结果。

    优点:移动数据的次数已知(n-1 次);

    缺点:比较次数多。 三、插入排序 已知一组升序排列数据a、a、……a[n],一组无序数据b、 b、……b[m],需将二者合并成一个升序数列。

    首先比较b与a的值,若b大于a,则跳过,比较b与a的值, 若b仍然大于a,则继续跳过,直 到b小于a 数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b插入到原来 a[x]的位置这就完成了b 的插入。b~b[m]用相同方法插入。

    (若无数组a,可将b当作n=1 的数组a)

    优点:稳定,快;

    缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决 这个问题。 四、缩小增量排序 由希尔在1959 年提出,又称希尔排序(shell 排序)。

    已知一组无序数据a、a、……a[n],需将其按升序排列。

    发现当n 不大时,插入 排序的效果很好。首先取一增 量d(d<n),将a、a[1+d]、a[1+2d]……列为第一组,a、a[2+d]、 a[2+2d]……列为第二组……,a[d]、a[2d]、a[3d]……="" 列为最后一组以次类推,在各组内用插入排序,然后取d'<d,重复上述操="" 作,直到d="1。" 优点:快,数据移动少;="" 缺点:不稳定,d="" 的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取。="" 五、快速排序="" 快速排序是冒泡排序的改进版,是目前已知的最快的排序方法。 ="" 已知一组无序数据a、a、……a[n],需将其按升序排列。首先任取数据a[x]="" 作为基准。比较a[x]与其它数据并="" 排序,使a[x]排在数据的第k="" 位,并且使a~a[k-1]中的每一个数="" 据a[x],然后采 用分治的策略分别对a~a[k-1]和a[k+1]~a[n] 两组数据进行快速排序。 优点:极快,数据移动少; 缺点:不稳定。

    2023-10-24 17:59:31
  • 堆排序是一种基于完全二叉树的排序算法,可以使用数组实现,C语言实现堆排序通常在以下两个函数中实现:

    ①建堆函数:将数组建成大根堆或小根堆;

    ②堆排序函数:不断执行建堆函数后调整堆种的堆顶元素与堆底元素,并重新构建堆。堆排序的优点:实现简单,不占用额外空间;时间复杂度稳定,在最坏情况下的时间复杂度为O(nlogn),相比其他的时间复杂度为O(n^2)的排序算法更快。堆排序的缺点:在处理大数据量时,需要分配一段连续的存储空间,不够灵活。同时,由于堆排序非常适合顺序存储结构,对于链表存储结构表现不佳。

    2023-10-24 17:59:31
最新问题 全部问题