首页 > 试题广场 >

并简述排序算法原理,分析这三种排序算法的时间复杂度、空间复杂

[问答题]

分别用直接插入、快速和基数排序算法对整数序列(12,2,16,30,8,28,4,10,20,6,18)进行从小到大顺序排序,写出第一趟的排序结果。并简述排序算法原理,分析这三种排序算法的时间复杂度、空间复杂度及稳定性。

/*
    直接插入排序
    时间复杂度:O(n^2)
        空间复杂度:1
        稳定性:稳定
*/
template<class T>
T* straightInsertion(T* array,int n){
    int i,j;
    T temp;
    for(i = 1; i < n; i++){
        j = i;
        temp = array[i];
        while(j > 0 && temp < array[j-1]){
            array[j] = array[j-1];//每比较一个数,比temp大的就后移一位
            j--;//移动已经排好部分的下标
        }
        array[j] = temp;
    }
    return array;
}
//
// Created by John on 2021/02/20.
  快速排序
    时间复杂度:平均O(nlog2n) 最坏O(n^2)
        空间复杂度:平均O(log2n) 最坏O(n)
        稳定性:不稳定
//  // template<class T> int getIndex(T* array,int low,int high){     T data = array[low];//取第一个元素作为枢轴,对表进行划分     while (low < high){         while (low < high && array[high] >= data) --high;//不断移动下标直到找到一个比枢轴小的值         array[low] = array[high];//把找到的值移动到左端         while (low < high && array[low] <= data) ++low;//不断移动下标直到找到一个比枢轴大的值         array[high] = array[low];//把找到的值移动到右端     }     array[low] = data;//枢轴值最终存放的位置     return low; } template<class T> T* quickSort(T* array,int low,int high){     if (low < high){         int index = getIndex(array,low,high);//以第一个元素为枢轴进行快排并且返回排序后枢轴元素的下标         //依次对枢轴元素左右的子表进行递归快排         quickSort(array,low,index-1);         quickSort(array,index+1,high);     }     return array; }

发表于 2021-02-20 18:38:45 回复(0)
基数排序的时空复杂度分析:
时间复杂度:
由于每一位都需要排序,因此首先需要d,
每一趟排序又可以分为分配和收集,分配中,由于有n个元素需要分配,因此为n。
收集过程中,由于有r(每个取值0-9都需要位一个队列)个队列,因此为r。
时间复杂度为O(d(n+r))。
空间复杂度:
需要使用r个队列,因此为O(r)
编辑于 2020-05-08 16:02:48 回复(1)