您的位置:首页 > 理论基础 > 数据结构算法

快速排序算法学习笔记

2016-08-17 19:52 225 查看
今天学习快速排序算法;

思想:分治法(选基准,分区,递归);

原理:在无序数列中随机选取一个元素作为基准进行分区,比这个元素小的放在左边,大的放右边,再对两边的元素继续选基准分区;知道不可分,排序完毕。不断的挖坑,填坑。http://blog.csdn.net/morewindows/article/details/6684558

性能最好:基准每次选在中间;o(nlogn);

性能最差:基准每次选到最大或者最小;O(n*n);

平均性能:o(nlogn);

代码实现:递归实现

void quick_sort(int *a,int left,int right)
{
if (left>=right)
return;
int key=a[left];//挖坑
int low=left;
int high=right;
while (low<high)
{
while (a[high] >= key && low < high)//找到右边第一位小于基准

high--;

if (low<high)
{
a[low]=a[high];//填坑,同时又出新坑
low++;
}
while (a[low] <= key && high>low)

low++;

if (low<high)
{
a[high]=a[low];
high--;
}

}
a[low]=key;//填坑
quick_sort(a,left,low-1);
quick_sort(a,low+1,right);

}


算法缺陷:在数据基本有序时,算法退化为冒泡排序;我们可以在每次划分后比较两端的长度,并先对短的序列进行排序(目的是先结束这些栈以释放空间),可以将最大深度降回到O(㏒n)级别。

快速排序在大多数情况下都是适用的,尤其在数据量大的时候性能优越性更加明显,需要考虑下优化以提高其在最坏情况下的性能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息