算法导论——第四章——快速排序
来源:互联网 发布:下载个淘宝网 编辑:程序博客网 时间:2024/05/21 04:02
1.快速排序的基本思想
设当前待排序的无序区为R[p,r],利用分治法可将快速排序的基本思想描述为:
①分解:
在R[p,r]中任选一个记录作为基准q,以此基准将当前无序区划分为左、右两个较小的子区间R[p,q-1)和R[q+1,r],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为q),右边的子区间中所有记录的关键字均大于等于q,而基准记录q则位于正确的位置(pivotpos)上,它无须参加后续的排序。
②求解:
通过递归调用快速排序对左、右子区间R[p,q-1]和R[q+1,r]快速排序。
③组合:
因为当"求解"步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,"组合"步骤无须做什么,可看作是空操作。
①分解:
②求解:
③组合:
代码如下
// 快速排序.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>using namespace std; int num=10; void swap(int &a, int &b) //交换数组元素{ int temp = a; a = b; b = temp;} void PrintArray(int *arr) //输出数组{ for(int i=0; i<num; ++i) cout << arr[i] << " "; cout << endl;} int Partition2(int *arr, int beg, int end) //划分数组{ int sentinel = arr[end]; ////用区间的最后数个记录作为基准 int i = beg-1; for(int j=beg; j<=end-1; j++) //从左向右扫描,查找第1个关键字小于sentinel的记录arr[j] { if(arr[j] <= sentinel) { i++; swap(arr[i], arr[j]); } } swap(arr[i+1], arr[end]); cout << "排序过程:"; PrintArray(arr); return i+1;} void QuickSort(int *arr, int beg, int end) //实现快速排序{ if(beg < end) { int pivot = Partition2(arr, beg, end); QuickSort(arr, beg, pivot-1); QuickSort(arr, pivot+1, end); }} int main(){ int arr[]={2,6,7,5,8,1,9,10,3,4}; QuickSort(arr, 0, 9); cout << "最后结果:"; PrintArray(arr); char x;cin >> x; return 0;}
算法分析
(1)最坏时间复杂度
(2) 最好时间复杂度
注意:
- 算法导论——第四章——快速排序
- MIT算法导论第四节笔记——快速排序
- 算法导论—快速排序
- 算法导论第四章-快速排序
- 算法导论笔记——快速排序
- 算法导论例程——快速排序
- 学习算法导论——快速排序
- 算法导论——快速排序
- 《算法导论》 — Chapter 7 快速排序
- 算法导论第七章例题——快速排序
- 算法导论第7章—快速排序
- 算法导论学习笔记——快速排序算法
- MIT算法导论-第四讲-快速排序
- 跟着《算法导论》学习——快速排序
- 《算法导论》学习笔记(2)——快速排序
- 算法导论——lec 07 快速排序
- 算法导论——快速排序(Quick-Sort)
- 《算法导论》学习摘要chapter-7——快速排序
- Qt写的行数统计工具[更新Dll]
- 使用数据库连接池优化程序性能
- Ubuntu-11.10之八 profile与bashrc的分析
- 算法导论——第三章——优先级队列(以堆为思想)
- ofstream建立文件问题
- 算法导论——第四章——快速排序
- HTML Script
- 处理new分配失败
- How to tile a background image in Android
- stm32学习经验
- 快速比较两字符串最大相同算法
- 算法导论——第五章——线性时间排序
- 数据绑定
- Permission Denial: starting Intent 解决办法 .