快速排序算法
来源:互联网 发布:java license 编辑:程序博客网 时间:2024/06/10 09:08
快速排序是一种比较快的排序,也是一种很经典的排序,诞生于1962年
它的采用分治法,分治法基本思想是将原问题分解为比原问题更小但是跟原问题结构相似的子问题,递归的解决这些子问题,则原问题就迎刃而解
快速排序的思想是
1. 分解
在数组中选择一个作为基准(pivot),并以此基准划分当前数组,使大于此基准的元素全部位于基准的右边,小于此基准的元素全部位于基准的左边
2.求解
分别将位于基准左边和右边的元素作为要排序的数组,递归调用进行快速排序
3.组合
当上述数组已排序完毕时,将左边数组 + 基准 + 右边数组 组合在一起,完成整个排序
C语言描述
//将数组与数组元素的个数作为形参
void my_quicksort(int a[],int n) {
void my_qsort(int a[], int low, int high);
my_qsort(a, 0, n-1);
}
//将数组与数组的最左边及最右边元素作为形参
void my_qsort(int a[], int low, int high) {
int pivottag;//基准元素在数组中的位置
//递归调用快速排序,直到待排序的数组剩下一个元素
if(low < high) {
pivottag = my_partitions(a, low, high);
my_qsort(a,low,pivottag - 1);//基准左边的元素排序
my_qsort(a,pivottag +1, high);//基准右边的元素排序
}
}
//一次快速排序
int my_partitions(int a[], int low, int high) {
int pivotkey;//基准
pivotkey = a[low];
//整个数组还未遍历完毕
while(low < high) {
while(pivotkey <= a[high] && low < high) {
--high;
}
//若基准右边的数组元素小于基准,则将此元素转移到基准左边
a[low] = a[high];
while(pivotkey >= a[low] && low < high) {
++low;
}
//若基准左边的数组元素大于基准,则将此元素转移到基准右边
a[high] = a[low];
}
//将基准转移到相应位置
a[low] = pivotkey;
//返回基准所在数组中的位置
return low;
}
它的采用分治法,分治法基本思想是将原问题分解为比原问题更小但是跟原问题结构相似的子问题,递归的解决这些子问题,则原问题就迎刃而解
快速排序的思想是
1. 分解
在数组中选择一个作为基准(pivot),并以此基准划分当前数组,使大于此基准的元素全部位于基准的右边,小于此基准的元素全部位于基准的左边
2.求解
分别将位于基准左边和右边的元素作为要排序的数组,递归调用进行快速排序
3.组合
当上述数组已排序完毕时,将左边数组 + 基准 + 右边数组 组合在一起,完成整个排序
C语言描述
//将数组与数组元素的个数作为形参
void my_quicksort(int a[],int n) {
void my_qsort(int a[], int low, int high);
my_qsort(a, 0, n-1);
}
//将数组与数组的最左边及最右边元素作为形参
void my_qsort(int a[], int low, int high) {
int pivottag;//基准元素在数组中的位置
//递归调用快速排序,直到待排序的数组剩下一个元素
if(low < high) {
pivottag = my_partitions(a, low, high);
my_qsort(a,low,pivottag - 1);//基准左边的元素排序
my_qsort(a,pivottag +1, high);//基准右边的元素排序
}
}
//一次快速排序
int my_partitions(int a[], int low, int high) {
int pivotkey;//基准
pivotkey = a[low];
//整个数组还未遍历完毕
while(low < high) {
while(pivotkey <= a[high] && low < high) {
--high;
}
//若基准右边的数组元素小于基准,则将此元素转移到基准左边
a[low] = a[high];
while(pivotkey >= a[low] && low < high) {
++low;
}
//若基准左边的数组元素大于基准,则将此元素转移到基准右边
a[high] = a[low];
}
//将基准转移到相应位置
a[low] = pivotkey;
//返回基准所在数组中的位置
return low;
}
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法------快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法---快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法:快速排序
- 排序算法 快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 【排序算法】快速排序
- 排序算法--快速排序
- 排序算法:快速排序
- BOOL CWnd::DestroyWindow()中出现ASSERT(m_hWnd == hWndOrig)断言的原因及解决方法
- Linux 下curl-loader的使用说明
- 《深入浅出设计模式》小结
- touch改变文件的访问日期和修改日期
- s3c2440 nand 控制器(以对K9F2G08U0A 256M读操作为例)
- 快速排序算法
- Page.IsPostBack
- IE与火狐的脚本解析setUserData
- [面试]鸿星尔克面试-锁机制/ 压缩数据库日志
- 父母皆祸害?
- java类中怎样获得jsp的application? (百度知道)
- ASP.NET 130道面试题及答案
- jtextpane jtextarea 使滚动条到最后(或最前) 通过设置光标位置
- 命令提示符整理