快速排序和归并排序
2017-03-09 21:11
197 查看
比较
两种算法都是分治(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]; } }
细节:
为了节约辅助数组的操作时间,这里是当做参数传进来的。。。无脑归并操作,一定要记住。。。
相关文章推荐
- 快速排序,归并排序
- 算法怎么就这么难---归并排序和快速排序
- 插入排序、选择排序、归并排序、堆排序、快速排序的JAVA实现
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 排序(插入排序,希尔排序,归并排序,快速排序)
- 几种常见的排序算法(插入排序,希尔排序,归并排序和快速排序)——希尔排序
- 链表排序-归并排序和快速排序
- 归并排序和快速排序
- 快速排序和归并排序Python3代码实现
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- [C] - 希尔排序,非递归的快速排序,递归的快速排序,堆排序,归并排序,基数排序
- 为什么快速排序在数组的情况下比归并排序快
- 直接插入排序、归并排序、推排序、快速排序
- 【算法和数据结构】排序(四)归并排序和快速排序(C++实现)
- 归并排序与快速排序的衍生问题
- 归并排序和快速排序的比较
- 归并排序和快速排序
- 归并排序和快速排序(三十二)
- 排序算法之插入排序、归并排序、快速排序
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结