排序算法-快速排序和堆排序
来源:互联网 发布:php短信验证码代码免费 编辑:程序博客网 时间:2024/05/07 12:49
排序算法-快速排序和堆排序
一:快速排序算法
快速排序在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
算法步骤:
1 从数列中挑出一个元素,称为 “基准”(pivot),
2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
在实现过程中,最后才对初始关键字赋值,注意交换过程中赋值下标顺序的正确性。
#include "iostream.h"void Qsort(int a[],int low,int high){int pivot,privotloc;int first,last;if(low>=high){return;}first=low;last=high;pivot=a[first];while(first<last){while(first<last&&a[last]>=pivot)--last; a[first]=a[last]; //比初始关键字小的移到数组前面while(first<last&&a[first]<=pivot)++first;a[last]=a[first]; //比初始关键字小的移到数组末端}a[first]=pivot; //初始关键字将数组分成两部分后,记录位置privotloc=first;Qsort(a,low,privotloc-1); //递归实现前半区Qsort(a,privotloc+1,high);//递归实现后半区}void main(){int b[8]={49,38,65,97,76,13,27,49}; //实例Qsort(b,0,7);for(int i = 0; i <8; i++) { cout <<b[i]<<endl; }}
二:堆排序算法
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
堆排序的平均时间复杂度为Ο(nlogn) 。
算法步骤:
- 创建一个堆H[0..n-1]
- 把堆首(最大值)和堆尾互换
3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置
4. 重复步骤2,直到堆的尺寸为1
编写代码时,出现了很多次错误,原因主要是:数组实现时,下标从0开始的,多处地方的下标没注意导致数组越界。
#include "iostream.h"
void heapadjust(int a[],int s,int m){int temp=a[s];for(int j=2*s+1;j<m-1;j=j*2){if(j<(m-1)&&a[j]<a[j+1])++j; //子节点中较大的一个if(temp>a[j]) break; //temp插入到此处a[s]=a[j]; //不满足堆定义,交换s=j;}a[s]=temp; //插入}void heapsort(int a[],int len){int temp;for(int i=len/2-1;i>=0;--i) //建立初始的大顶堆{heapadjust(a,i,len);}for(i=len-1;i>0;--i){temp=a[0];a[0]=a[i];a[i]=temp; //堆顶与未排序的最后一个记录交换heapadjust(a,0,i); //重新调整为大顶堆}}void main(){int b[8]={49,38,65,97,76,13,27,49};heapsort(b,8);for(int i = 0; i <8; i++) { cout <<b[i]<<endl; }}
- 排序算法-快速排序和堆排序
- 快速 和堆 排序算法
- 【经典】【排序】快速排序算法、堆排序
- 快速排序和堆排序
- 堆排序和快速排序
- 堆排序和快速排序
- 快速排序和堆排序
- 快速排序和堆排序
- 算法有插入排序,堆排序,合并排序,快速排序和stooge排序
- 堆建立和堆排序,快速排序
- 二哥学算法之快速排序和堆排序
- 三大排序算法(快速排序,归并排序,堆排序)
- 排序算法 快速排序 归并排序 堆排序
- 排序算法(归并排序, 快速排序, 堆排序)
- 三种排序算法(归并排序、快速排序,堆排序)
- 排序算法:希尔、归并、快速、堆排序
- 排序算法:希尔、归并、快速、堆排序
- 排序算法(二):快速,归并,堆排序
- android不同Activity之间进行切换
- .net 在后台获取Html控件的值
- 正则表达式
- P122第36题
- springMVC:js中请求ajax实例
- 排序算法-快速排序和堆排序
- 剑指offer-12 打印1到最大的N位数
- IOS CoreData基础
- Uva 12169
- nyoj题目57:6174问题
- Copy和MutableCopy
- 上拉电阻的选择方法
- 数据结构之单源最短路径(迪杰斯特拉算法)-(九)
- HDU 2176 取(m堆)石子游戏 简单Nim游戏