快速排序和归并排序
来源:互联网 发布:mac键盘使用技巧 编辑:程序博客网 时间:2024/05/20 06:08
比较
两种算法都是分治(Divide and Conquer)算法。。
但是快速排序是先整体(<= pivot pivot >= pivot)后局部…..
原地操作。。。具有稳定性。。平均O(nlogn)
而归并排序是先局部(小数组排好序)后整体(排好序的小数组Merge)
空间复杂为O(n)…..稳定。。。都是O(nlogn)
Code:
快速排序:
public class QuickSort { public static void sortIntegers(int[] nums){ if (nums == null || nums.length == 0){ return; } quickSort(nums, 0 ,nums.length - 1); } private static void quickSort(int[] nums, int start, int end){ if (start >= end){ return; } int left = start, right = end; int pivot = nums[(start + end) / 2]; //parttion while (left <= right){ while (left <= right && nums[left] < pivot){ left++; } while (left <= right && nums[right] > pivot){ right--; } if (left <= right){ int tmp = nums[left]; nums[left] = nums[right]; nums[right] = tmp; left++; right--; } } quickSort(nums, start, right); quickSort(nums, left, end); }
细节:
这里要注意pivot取得是元素,而不是下标。。另外left <= right 可以避免子数组相交。为了切分均匀,nums[xx] 与pivot之间没有等号。。
归并排序:
public class MergeSort { public static void sortIntegers(int[] nums){ int[] tmp = new int[nums.length]; mergeSort(nums, 0, nums.length - 1, tmp); } private static void mergeSort(int[] nums, int start, int end, int[] tmp){ if (start >= end){ return; } int mid = (start + end) /2; mergeSort(nums, start, mid, tmp); mergeSort(nums, mid + 1, end, tmp); merge(nums, start, end, tmp); } private static void merge(int[] nums, int start, int end, int[] tmp){ int mid = (end + start) /2; int left = start, right = mid + 1; int index = start; while (left <= mid && right <= end){ if (nums[left] < nums[right]){ tmp[index++] = nums[left++]; } else{ tmp[index++] = nums[right++]; } } while(left <= mid){ tmp[index++] = nums[left++]; } while(right <= end){ tmp[index++] = nums[right++]; } for(int i = start; i <= end; i++){ nums[i] = tmp[i]; } }
细节:
为了节约辅助数组的操作时间,这里是当做参数传进来的。。。
无脑归并操作,一定要记住。。。
0 0
- 快速排序和归并排序
- 归并排序和快速排序
- 归并排序和快速排序
- 归并排序和快速排序
- 归并排序和快速排序
- 归并排序和快速排序
- 归并排序和快速排序
- 快速排序和归并排序
- 归并排序和快速排序
- 快速排序和归并排序
- 排序:快速排序和归并排序
- 排序之归并排序和快速排序
- 冒泡、归并和快速排序
- 归并排序和快速排序算法实现
- 归并排序和快速排序的比较
- 快速排序和归并排序区别
- Python算法 归并排序和快速排序
- 归并排序和快速排序的浅析
- 中国的支付清算体系
- 【C++】学习笔记三十五——函数和string对象
- 读林沛满的《Wireshark网络分析就这么简单》和《Wireshark网络分析的艺术》
- 读书笔记 effective c++ Item 29 为异常安全的代码而努力
- 库函数
- 快速排序和归并排序
- 安迪的第一个字典uva10815
- javaScript---oop
- Echarts折柱图异步加载
- ZCMU—H
- struts2
- Python 3.5 + PyInstaller 3.2.1打包exe出错,TypeError: read() takes no keyword arguments
- 解决ScrollView里嵌套 RecyclerVIew 时,RecyclerVIew 滑动不流畅的问题
- 利用js获取客户端ip的方法