前言
排序算法的重要性无需多言,无论是面试还是工作中,它占据的位置都是很重的。一般,我们学习的都是十大排序等基础排序,而在面试中,堆排,归并,快排几个排序又非常高频。此外,部分排序如 topk 问题等在面试中都非常出现,解决办法如堆的使用,快速选择,快排的 partition 操作等都很常见。而除此外排序单独出现的题型一般都比较少,更多的是与其它题型结合起来。
分析
对于基础排序,即基于比较的冒泡,选择,插入等,优化的希尔,归并,快排,还有基于非比较的桶排,计数排序等。都是需要掌握的。
除了常见的十大排序,在工业上,有两个结合的排序也可以掌握,分别是内审排序(快排+插入+堆的组合),tim 排序(二分插入、归并),很多语言的 sort 实现基本都是这两个,如 go 使用的就是内审排序,而 python,java 就使用了 tim 排序。前者不稳定,否则稳定。
重点需要掌握该排序的原理,复杂度,使用场景等几个要点。而具体的细节这里就不展开,有非常多优秀的文章进行讲解。
题型
排序算法的题型我总结了几个方面,主要有 十大算法的实现、topk 问题、归并、摩尔投票等。
十大排序的实现
冒泡排序
public int[] sortArray(int[] nums) {for(int i = 0;i < nums.length; i++){for(int j = 0; j < nums.length-1; j++){if(nums[j] > nums[j+1]){int temp = nums[j];nums[j] = nums[j+1];nums[j+1] = temp;}}}return nums;}
选择排序
public int[] sortArray(int[] nums) {for(int i = 0; i < nums.length; i++){int min = i;for(int j = i+1; j < nums.length; j++){if(nums[j] < nums[min]){min = j;}}if(i != min){int temp = nums[i];nums[i] = nums[min];nums[min] = temp;}}return nums;}
插入排序
public int[] sortArray(int[] nums) {//从下标为1的元素开始选择合适的位置插入//因为下标为0的只有一个元素,默认是有序的for(int i = 1;i < nums.length; i++){// 记录要插入的数据int temp = nums[i];// 从已经排序的序列最右边的开始比较,找到比其小的数int j = i;while(j > 0 && temp < nums[j-1]){nums[j] = nums[j-1];j--;}// 存在比其小的数,插入if(j != i){nums[j] = temp;}}return nums;}
希尔排序
public int[] sortArray(int[] nums) {for(int gap = nums.length/2; gap > 0; gap /= 2){for(int i = gap; i < nums.length; i++){int temp = nums[i];int j = i - gap;while(j >= 0 && nums[j] > temp){nums[j + gap] = nums[j];j -= gap;}nums[j + gap] = temp;}}return nums;}
归并排序
快速排序
public int[] sortArray(int[] nums) {return quickSort(nums,0,nums.length-1);}public int[] quickSort(int[] nums,int left,int right){if(left < right){int partitionIndex = partition(nums,left,right);quickSort(nums,left,partitionIndex-1);quickSort(nums,partitionIndex+1,right);}return nums;}public int partition(int[] nums,int left,int right){int pivot = left;int index = pivot + 1;for(int i = index;i < nums.length;i++){if(nums[i] < nums[pivot]){swap(nums,i,index);index++;}}swap(nums,pivot,index-1);return index-1;}public void swap(int[] nums,int i,int j){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
