快速排序总结
来源:互联网 发布:淘宝十大人气主播 编辑:程序博客网 时间:2024/06/07 07:33
快速排序
快速排序是一种经常使用应用最广泛的一种排序算法,它可以算是冒泡排序的一种改进。
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列;排序流程为先选取一个key(一般选取最左或最右)将数据分割两部分,再运用递归直到递归到只有一个元素。
单趟排序方法
左右指针法:
例如:
将其转化为代码为:
int part1(int* a, int left, int right) //每次确定一个位置{ int begin = left; int end = right; int key = a[right]; while (begin<end) { while (begin<end && a[begin] <= key) //逐次找到 { begin++; } while (begin<end && a[end] >= key) //逐次找到 { end--; } swap(a[begin], a[end]); } swap(a[begin],a[right]); return begin;}void QuickSort1(int* a, int left, int right){ if (left < right) { int div = part1(a, left, right); QuickSort1(a, left, div - 1); QuickSort1(a, div + 1, right); }}
挖坑法:挖坑法:首先找一个最左或者是最右端作为一个起始坑,保存坑中的值,然后如果在最左,那么就让left找一个比保存值大的,然后进行把这个值填坑,填完以后现在这个值的这个位置就变成了坑,然后我们继续让right在区间内找一个比保存值小的,找到以后填了刚才的坑,现在这个位置变成了新坑,这样一直继续下去,直left==right,这个时候坑无法再次变动,把保存的初始值填入坑中。这个就是挖坑法的单趟排序。
例如:
将其转化为代码为:
int port2(int*a, int left, int right){ int key = a[right]; while (left<right) { while (left<right && a[left] <= key) // { ++left; } if (left<right) { a[right--] = a[left]; } while (left<right && a[right] >= key) { --right; } if (left < right) { a[left++] = a[right]; } } a[left] = key; return left;}void QuickSort(int* a, int left, int right){ if (left < right) { int div = port2(a, left, right); QuickSort(a, left, div - 1); QuickSort(a, div + 1,right); }}
前后指针法:
声明两个变量,一个prev,一个cur;开始将prev初始化成cur-1,判断prev+1是否等于cur,prev+1,不等于交换,逐次进行交换。
将其转化为代码为:
““
int part3(int* a, int left, int right)
{
int cur = left;
int prev = left - 1;
int key = a[right];
while (cur < right){ if (a[cur] < key && ++prev != cur) //如果++prev == cur,相遇说明没有数比key大,没有相遇则之前一个数大于key交换再判断 { swap(a[cur], a[prev]); } ++cur;}swap(a[++prev], a[right]);return prev;
}
void QuickSort2(int*a, int left, int right)
{
if (left < right)
{
int div = part3(a, left, right);
QuickSort2(a, left, div - 1);
QuickSort2(a, div + 1,right);
}
}
““
阅读全文
0 0
- 总结的快速排序
- 快速排序总结
- 【排序总结--插入、快速】
- 快速排序总结
- 快速排序总结_legend
- 快速排序总结
- C++快速排序总结
- 快速排序总结
- 快速排序总结
- java快速排序总结
- Java快速排序总结
- 快速排序算法总结
- 快速排序总结
- 快速排序分析总结
- qsort快速排序总结
- 快速排序法总结
- 快速排序总结
- 快速排序总结
- 给第三方没有加密的dll强打签名
- Framework7跳转页面如何自动隐藏工具栏(no-tabbar)
- hive-site.xml
- s3c6410时钟体系
- MAC终端命令自动补全
- 快速排序总结
- isPrime
- Android系统自动转屏流程(一)
- linux下调用opencv接口函数在指定图片上面画几何图形
- shiro 减少用redis实现的自定义SessionDAO的doUpdate的调用次数
- Android系统自动转屏流程(二)
- Python UnitTest 文档中文翻译-2-3(渣翻自娱)
- 反向代理概念
- Android混淆心得