其他分享
首页 > 其他分享> > 快速排序和希尔排序

快速排序和希尔排序

作者:互联网


title: "快速排序和希尔排序"
author: Sun-Wind
date: January 2, 2021

背景:复习使用

快速排序

思想和时间复杂度

快速排序是由东尼·霍尔所发展的一种排序算法。
在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。
快速排序又是一种分而治之思想在排序算法上的典型应用。
虽然 Worst Case 的时间复杂度达到了 O(n²),但是在大多数情况下都比平均时间复杂度为 O(n logn) 的排序算法表现要更好。

快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。 ------《算法艺术和信息学奥赛》

由于基准值的不确定,快速排序经常要交换两个数的相对位置,所以快速排序不是稳定的排序算法
可以说,快速排序是优化版的冒泡排序

算法步骤

代码实现

Paritition1(int A[], int low, int high) {
   int pivot = A[low];//基准初始值从low开始
   while (low < high) {
     while (low < high && A[high] >= pivot) {
       --high;
     }
     A[low] = A[high];//找到high起第一个比基准值小的元素
     while (low < high && A[low] <= pivot) {
       ++low;
     }
     A[high] = A[low];//找到low起第一个比基准值大的元素
   }
   A[low] = pivot;//还原基准值
   //由于是递归实现,此时已经按照基准值分好了界限
   return low;
 }

 void QuickSort(int A[], int low, int high) //快排母函数
 {
   if (low < high) {
     int pivot = Paritition1(A, low, high);
     QuickSort(A, low, pivot - 1);
     QuickSort(A, pivot + 1, high);
   }
 }

希尔排序

思想和时间复杂度

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。
希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。
希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

算法步骤

代码实现

void shellsort(int arr[], int n) {
    int gap, i, j, temp;

    for(gap = n/2; gap > 0; gap /= 2)
        for(i = gap; i < n; i++)
            for(j = i - gap; j >= 0 && arr[j] > arr[j+gap]; j -= gap) {
                temp = arr[j];
                arr[j] = arr[j+gap];
                arr[j+gap] = temp;
            }
}

标签:arr,算法,gap,high,希尔,low,排序,快速
来源: https://www.cnblogs.com/Sun-Wind/p/15757468.html