快速排序 && 希尔排序 && 插入排序
2014-05-03 00:34
288 查看
1. 快速排序
不稳定的排序。
平均(与最好情况)时间复杂度:O(nlgn) | 最坏情况时间复杂度(元素有序,递归栈为 O(n)):O(n2)
适合的数据结构:数组,双向链表。
2. 希尔排序
直接插入排序的改进,是不稳定的排序。
Shell’s Sort 又称“缩小增量排序”。
增量序列必须满足:没有除 1 之外的公因子,最后增量值等于 1 。
增量的取法:
dlta[ k ] = 2t-k+1 - 1 时,时间复杂度为 O(n3/2),其中 t 为排序趟数,1 ≤ k ≤ t ≤ floor(log2(n+1))。
dlta[ k ] = 2t-k + 1,0 ≤ k ≤ t ≤ floor(log2(n-1))。1, 2, 3, 5, 9…
dlta[ k ] = 1/2(3t-k - 1),0 ≤ k ≤ t ≤ floor(log3(2n+1))。1, 4, 13, 40…
适合的数据结构: 数组, 双向链表。
3. 直接插入排序
稳定的排序。
时间复杂度 O(n2)。
适合的数据结构: 数组,双向链表。
不稳定的排序。
平均(与最好情况)时间复杂度:O(nlgn) | 最坏情况时间复杂度(元素有序,递归栈为 O(n)):O(n2)
适合的数据结构:数组,双向链表。
#include <stdio.h> #include <stdlib.h> int partition(int data[], int low, int high) { int value = data[low]; // can be done randomly while(low < high) { while(low < high && data[high] >= value) --high; data[low] = data[high]; while(low < high && data[low] <= value) ++low; data[high] = data[low]; } data[low] = value; return low; } void QuickSort(int data[], int low, int high) { if(low < high) { int mid = partition(data, low, high); QuickSort(data, low, mid); QuickSort(data, mid+1, high); } } void init(int data[], int length) { for(int i = 0; i < length; ++i) data[i] = rand() % 10000; } int main() { enum{ N = 5000}; int numbers = {0}; init(numbers, N); // if commented out, the numbers is ordered, the stack is N, then overflow! QuickSort(numbers, 0, N-1); for(int i = 0; i < N; ++i) printf("%d\t", numbers[i]); printf("\n"); return 0; }
2. 希尔排序
直接插入排序的改进,是不稳定的排序。
Shell’s Sort 又称“缩小增量排序”。
增量序列必须满足:没有除 1 之外的公因子,最后增量值等于 1 。
增量的取法:
dlta[ k ] = 2t-k+1 - 1 时,时间复杂度为 O(n3/2),其中 t 为排序趟数,1 ≤ k ≤ t ≤ floor(log2(n+1))。
dlta[ k ] = 2t-k + 1,0 ≤ k ≤ t ≤ floor(log2(n-1))。1, 2, 3, 5, 9…
dlta[ k ] = 1/2(3t-k - 1),0 ≤ k ≤ t ≤ floor(log3(2n+1))。1, 4, 13, 40…
适合的数据结构: 数组, 双向链表。
#include <stdio.h> #include <stdlib.h> void ShellInsert(int data[], int length, int dk) { int temp, j; for(int i = dk; i < length; ++i) { temp = data[i]; for(j = i-dk; j >= 0 && data[j] > temp; j -= dk) data[j+dk] = data[j]; data[j+dk ]= temp; } } void ShellSort(int data[], int length, int dlta[],int t) /* t 为排序趟数 and dlta 长度 */ { for(int k = 0; k < t; ++k) ShellInsert(data, length, dlta[k]); } void init(int data[], int length) { for(int i = 0; i < length; ++i) data[i] = rand(); } int main() { enum{ N = 100000}; int dlta[] = {7, 3, 1}; int numbers = {0}; init(numbers, N); ShellSort(numbers, N, dlta, 3); /* 3 为a排序趟数 and dlta 长度 */ for(int i = 0; i < N; ++i) printf("%d\t", numbers[i]); printf("\n"); return 0; }
3. 直接插入排序
稳定的排序。
时间复杂度 O(n2)。
适合的数据结构: 数组,双向链表。
void InsertSort(int data[], int length) { int j; for(int i = 1; i < length; ++i) { if(data[i] < data[i-1]) { int value = data[i]; //data[i] = data[i-1]; for(j = i-1; j >= 0 && data[j] > value; --j) data[j+1] = data[j]; data[j+1] = value; } } }
相关文章推荐
- 数据结构-排序算法详解(插入排序,希尔排序,堆排序,归并排序,快速排序,桶式排序)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现
- 排序方法了解一下(冒泡排序、选择排序、堆排序、插入排序、希尔排序、归并排序、快速排序、基数排序)
- C语言常用的排序方法:冒泡排序,插入排序,快速排序,堆排序,希尔排序
- C++ ------------排序算法(冒泡排序-快速排序-选择排序-插入排序-希尔排序)
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析(好戏在后面,有图有真相)
- 选择排序,插入排序,冒泡排序,希尔排序,快速排序,归并排序
- 已完成以下算法:冒泡排序,插入排序,希尔排序,快速排序,基数排序
- 七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)
- 七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法, 冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 各种排序算法总结----基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
- 插入排序,希尔排序,堆排序,归并排序,快速排序Java实现
- 常见比较排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- C++算法 冒泡排序,快速排序,插入排序,希尔排序,计数排序,基数排序 性能比较