算法学习——快速排序
2014-09-27 10:06
232 查看
算法学习————快速排序
快速排序是一种很简单的算法,其平均时间复杂度为O(n log n),在最坏的情况下快速排序时间复杂度会降为O(n*n)。算法简介
快速排序是二分法思想的一种应用,下面通过递归的方法表示执行过程选择一个基数,可以选择数组中间的值作为基准。但它并不一定是中间的值,可以是任意值,甚至可以是不在排序数组的值。
分组,用下面的方法重新排序,所有比基准小的都放在左半部分,所有比基准大的放在右边,相等的可以保留在任意部位,数组不一定会被均分。
排序,应用上面的方法对左边和右边进行迭代。
分组过程
在每次开始分组的时候都有两个参数i和j,其中i指向开始的元素,j指向最后的元素。向前移动i直到找到大于等于基准的元素,j向后移动直到元素值,小于或等于基准。如果 i ≤ j,就交换两者的值,并且i指向下一个元素。j指向前一个元素,当i大于j时,算法结束。分组完毕后,在第i项之前的元素全部不大于基准在第j项之后的元素全部不小于基准。
下面给出利用快排对 {1, 12, 5, 26, 7, 14, 3, 7, 2}排序。
Java实现
int partition(int arr[], int left, int right) { int i = left, j = right; int tmp; int pivot = arr[(left + right) / 2]; while (i <= j) { while (arr[i] < pivot) i++; while (arr[j] > pivot) j--; if (i <= j) {//分组,交换两个元素位置 tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i++; j--; } }; return i; } void quickSort(int arr[], int left, int right) { int index = partition(arr, left, right); if (left < index - 1) quickSort(arr, left, index - 1); if (index < right) quickSort(arr, index, right); }
看网上解释挖坑填数+分治法感觉挺好理解的,学习一下
static void quicksort(int n[], int left, int right) { int dp; if (left < right) { dp = partition(n, left, right); quicksort(n, left, dp - 1); quicksort(n, dp + 1, right); } } static int partition(int n[], int left, int right) { int pivot = n[left]; while (left < right) { //从右到左,找比基准小的 while (left < right && n[right] >= pivot) right--; if (left < right) n[left++] = n[right];//将right填充到left位置,此时s[left]和s[right]是同一个值,right另外的值填充 //从左到右,找比基准大的值 while (left < right && n[left] <= pivot) left++; if (left < right) n[right--] = n[left];//赋值给right } n[left] = pivot;//比较完left=right,将值填到这个坑里 return left; }
本文参考自 MoreWindows
相关文章推荐
- 由快速排序引申而来--如何学习算法
- 由快速排序引申而来--如何学习算法
- 算法学习之快速排序(java)
- 算法(第四版)学习笔记之java实现快速排序
- 简单算法学习之快速排序详解
- 算法学习-排序算法-快速排序
- 学习算法导论——快速排序
- 算法与数据结构学习 07 快速排序
- 我的Java开发学习之旅------>Java经典排序算法之快速排序
- 由快速排序引申而来--如何学习算法
- 由快速排序引申而来--如何学习算法
- 算法学习笔记之快速排序
- 算法学习与实践之快速排序
- 数据结构和算法学习系列之快速排序的Partition函数一种实现方法
- 一步步学习数据结构和算法之快速排序效率分析及java实现
- 由快速排序引申而来--如何学习算法
- 算法学习笔记----快速排序
- 每天学习算法系列—内部排序之归并排序和快速排序
- 算法学习:快速排序
- 经典算法学习——快速排序