MIT:算法导论——4.2快速排序 以及 排序算法时间复杂度分析
2014-06-05 10:34
876 查看
【本课例子】
(1)快速排序:分割算法
① 快速排序程序:
① 新的划分程序中,仅在真正进行划分前进行一次交换:
算法执行实例:
常见排序算法时间复杂度及分析——只有快速排序的 最坏情况与平均情况不一致:
(1)快速排序:分割算法
① 快速排序程序:
QUICKSORT( A, p, r ) if p < r q = PARTITION( A, p, r ) QUICKSORT( A, p, q - 1 ) QUICKSORT( A, q + 1, r )② 数组划分
PARTITION( A, p, r ) x = A[r] i = p - 1 for j = p to r - 1 if a[j] < x i += 1 exchange A[i] with A[j] exchange A[i+1] with A[r] return i + 1(2)随机算法
① 新的划分程序中,仅在真正进行划分前进行一次交换:
RANDOMIZED-PARTITION( A, p, r ) i = RANDOM( p, r ) exchange A[r] with A[i] return PARTITION( A, p, r )② 新的快速排序不再调用PARTITION,而是调用RANDOMIZED-PARTITION:
RANDOMIZED-QUICKSORT( A, p, r ) if p < r q = RANDOMIZED-PARTITION( A, p, r ) RANDOMIZED-QUICKSORT( A, p, q - 1 ) RANDOMIZED-QUICKSORT( A, q + 1, r )
#if 0 【本课例子】 (1)快速排序:分割算法 (2)随机算法 #endif #if 1 #include <iostream> #include <queue> using namespace std; struct LOC{ int low; int high; LOC& operator=( LOC& rhs ){ this->low = rhs.low; this->high = rhs.high; return *this; } }; int partion( int a[], int low, int high ); void quick_sort( int a[], int low, int high ); int main( void ) { cout << "2014-6-4 16:06:57" << endl; int a[] = { 13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7 }; partion( a, 0, sizeof( a ) / sizeof( int ) - 1 ); for( int i = 0; i < sizeof( a ) / sizeof( int ); ++i ) cout << a[i] << " "; cout << endl; quick_sort( a, 0, sizeof( a ) / sizeof( int ) - 1 ); for( int i = 0; i < sizeof( a ) / sizeof( int ); ++i ) cout << a[i] << " "; cout << endl; //int *b = NULL; //quick_sort( b, 0, sizeof( b ) / sizeof( int ) - 1 ); return 0; } int partion( int a[], int low, int high ) { int pivot = a[low]; while( low < high ){ while( low < high ){ if( a[high] < pivot ) break; --high; } if( low < high ) a[low] = a[high]; while( low < high ){ if( a[low] > pivot ) break; ++low; } if( low < high ) a[high] = a[low]; } a[low] = pivot; return low; } void quick_sort( int a[], int low, int high ) { if( a == NULL || low >= high ) return; queue<LOC> qu; LOC loc, locIn; loc.low = low; loc.high = high; qu.push( loc ); while( !qu.empty() ){ loc = qu.front(); qu.pop(); int mid = partion( a, loc.low, loc.high ); if( loc.low < mid - 1 ){ locIn.low = loc.low; locIn.high = mid - 1; qu.push( locIn ); } if( loc.high > mid + 1 ){ locIn.low = mid + 1; locIn.high = loc.high; qu.push( locIn ); } } } #endif
算法执行实例:
常见排序算法时间复杂度及分析——只有快速排序的 最坏情况与平均情况不一致:
算法 | 最坏情况运行时间 | 平均情况/期望运行时间 |
插入排序 | O(n^2) | O(n^2) |
冒泡排序 | O(n^2) | O(n^2) |
选择排序 | O(n^2) | O(n^2) |
归并排序 | O(nlogn) | O(nlogn) |
快速排序 | O(n^2) | O(nlogn) |
堆排序 | O(nlogn) | O(nlogn) |
计数排序 | O(n+k) | O(n+k) |
基数排序 桶排序 | O(d(n+k)) O(n^2) | O(d(n+k)) O(n) |
相关文章推荐
- 排序算法的C语言实现以及各个算法的时间复杂度和空间复杂度分析(冒泡排序)
- 排序算法——希尔排序的图解、代码实现以及时间复杂度分析
- n个无序整数,已知第i个数在排好序的序列中的位置为j,满足|i-j|<=K,请设计一种排序算法,对该序列进行排序。注:算法时间复杂度为O(nlgn)的得0分,复杂度为O(nk) 的得两分,总分是20分
- 快速排序和冒泡排序的时间复杂度分析(C++算法实现对比)
- 常见排序算法的C语言实现以及算法复杂度分析(持续更新)
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
- 【算法导论】排序 (三):快速排序 深入分析
- MIT:算法导论——1.算法分析——插入排序 vs 二路归并排序
- 浅谈直接插入排序算法思想以及时间复杂度分析
- 排序算法——快速排序的图解、代码实现以及时间复杂度分析
- Java-时间复杂度为O(nlogn)的排序算法(快速排序, 归并排序, 堆排序, 希尔排序)
- 快速排序的C#实现以及,算法导论上之后一个习题的思考
- 排序算法——插入排序的图解、代码实现以及时间复杂度分析
- 时间复杂度为O(N*logN)的排序算法——归并排序、快速排序、堆排序
- 快速排序不同输入规模时间复杂度分析
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 算法时间复杂度分析基础
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 时间复杂度算法分析有方法(摘)
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)