基础数据结构和算法8:高级排序算法

1. 归并排序

1.1 步骤

  1. 实现两个有序数组的合并
    void merge(int arr[],int n,int mid);
    
  2. 拆分并合并数组
    void merge_sort(int arr[],int n);
    

1.2 参考代码

void merge(int arr[],int n,int mid){
    int temp[n];
    memcpy(temp,arr,n*sizeof(int));
    int p = 0,q = mid,k = 0;
    while(p

1.3 时间复杂度

一共拆分次,每次比较个元素,一共比较次。

1.4 空间复杂度

随着的增长,排序需要增加额外空间(临时数组和递归调用函数栈),空间复杂度为。


2. 快速排序

2.1 步骤

  1. 根据基准元素重排数组
    int partition(int arr[],int n);
    
  2. 依次排列两个部分
    void quick_sort(int arr[],int n);
    

2.2 参考代码

int partition(int arr[],int n){
    int key = arr[0];
    int p = 0,q = n-1;
    while(p=key) q--;
        arr[p] = arr[q];
        while(p

2.3 时间复杂度

一共拆分次,每次比较个元素,一共比较次。

2.4 空间复杂度

随着的增长,排序需要增加额外空间(递归函数栈空间),空间复杂度为。

2.5 优化

交换指针法

int partition(int arr[],int n){
    int key = arr[0];
    int p = 0,q = n-1;
    while(p=key) q--;
        while(p=q) break;
        swap(arr+q,arr+p);
    }
    swap(arr,arr+q);
    return q;
}

3. 希尔排序

3.1 步骤

  1. 划分gap并执行排序
    void shell_sort(int arr[],int n);
    
  2. 根据gap执行插入排序
    void insertion_sort(int arr[],int n,int gap);
    
  3. 根据gap插入
    void insert(int arr[],int n,int gap);
    

3.2 参考代码

void insert(int arr[],int n,int gap){
    for(int i=n-1-gap;i>=0;i-=gap){
        if(arr[i+gap]=1;i/=2){
        insertion_sort(arr,n,i);
    }
}

比较:插入排序与希尔排序


基础数据结构和算法8:高级排序算法_第1张图片

3.5 优化

移动代替交换

void insert(int arr[],int n,int gap){
    int key = arr[n-1];
    int index = (n-1)%gap; // 最前面一个元素的下标
    for(int i=n-1-gap;i>=0;i-=gap){
        if(key=1;i/=2){
        insertion_sort(arr,n,i);
    }
}

4. 小结

No. 算法 Algorithm Time Complexity Space Complexity Stable
1 快速排序 Quicksort No
2 归并排序 Mergesort Yes
3 希尔排序 Shell Sort No

你可能感兴趣的:(基础数据结构和算法8:高级排序算法)