选择排序

遍历,两两交换
插入排序
冒泡排序

相邻接点进行比较。
function(nums, k) {//冒泡排序const length= nums.lengthfor(let i=0;i<nums.length;i++){for(let j=0;j<length-i;j++){if(nums[j]>nums[j+1]){const temp=nums[j+1]nums[j+1]=nums[j]nums[j]=temp}}}return nums;};
快速排序
http://data.biancheng.net/view/117.html
当遇到有序数组时,时间复杂度最坏情况退化成O(N2),所以可以取中间值。
912.排序数组
var quickSort=function(nums,begin,end){if (begin < end) {const index=Math.floor((begin+end)/2)let key = nums[index];nums[index]=nums[begin]nums[begin]=key;let i = begin;let j = end;while (i < j) {while (i < j && nums[j] >= key) {j--;}nums[i] = nums[j];while (i < j && nums[i] < key) {i++;}nums[j] = nums[i];}nums[i] = key;quickSort(nums, begin, i - 1);quickSort(nums, i + 1, end);}}var sortArray = function(nums) {quickSort(nums,0,nums.length-1)return nums};
215. 数组中的第K个最大元素
var findKthLargest = function(nums, k) {const len = nums.length;let l = 0 ,r = len - 1;let target = len - k;while(l < r) {let idx = getPartion(nums, l, r); //分治思想if(idx === target){return nums[idx]}else if(idx < target) {l = idx + 1; //二分法,缩小范围}else {r = idx - 1;}}return nums[l];};function getPartion(nums, start, end) {const povit = nums[start]; //基准值while(start < end){while(start < end && nums[end] >= povit){end --;}nums[start] = nums[end]; //找到右边比基准值小的,与基准值交换while(start < end && nums[start] < povit){start ++;}nums[end] = nums[start];//找到左边比基准值大的,与基准值交换}nums[start] = povit;return start}
归并排序
https://www.cnblogs.com/chengxiao/p/6194356.html
归并排序使用分而治之的概念对给定的元素列表进行排序。它将问题分解为较小的子问题,直到它们变得足够简单以至可以直接解决为止。
以下是归并排序的步骤:
- 将给定的列表分为两半(如果列表中的元素数为奇数,则使其大致相等)。
- 以相同的方式继续划分子数组,直到只剩下单个元素数组。
- 从单个元素数组开始,排序合并子数组。
- 重复第 3 步单元,直到最后得到一个排好序的数组。



912.排序数组
var merge = function (nums, begin, end, mid) {let temp = [];let i = begin,j = mid + 1,res = 0;while (i <= mid && j <= end) {if (nums[i] <= nums[j]) {temp[res++] = nums[i++];} else {temp[res++] = nums[j++];}}// 右子数组完了while (i <= mid) {temp[res++] = nums[i++];}// 右子数组没完while (j <= end) {temp[res++] = nums[j++];}// 将 temp 数组的内容赋值回原数组中for (let k = begin; k <= end; k++) {nums[k] = temp[k - begin];}};var mergeSort = function (nums, begin, end) {if (begin < end) {const mid = Math.floor((begin + end) / 2);mergeSort(nums, begin, mid);mergeSort(nums, mid + 1, end);merge(nums, begin, end, mid);}return;};var sortArray = function (nums) {mergeSort(nums, 0, nums.length - 1);return nums;};
将整个排序序列看成一个二叉树分解,首先将树分解到每一个子节点,树的每一层都是一个归并排序的过程,每一层归并的时间复杂度为O(n),因为整个树的高度为lgn 所以归并排序的时间复杂度不管在什么情况下都是O(nlogn)
归并排序的平均时间复杂度为 O(nlogn) ,最坏时间复杂度为 O(nlogn) ,空间复杂度为 O(n) ,是稳定排序。
希尔排序
堆排序
https://www.cnblogs.com/chengxiao/p/6129630.html
347. 前 K 个高频元素
//方法一:哈希表var topKFrequent = function (nums, k) {let map = {}for (let num of nums) {map[num] = (map[num] || 0) + 1}let arry = Object.keys(map).sort((a, b) => {if (map[b] == map[a]) {return a > b ? 1 : -1} else {return map[b] - map[a]}})return arry.splice(0, k)};//方法二:堆排序
https://www.cnblogs.com/rungang/p/11391221.html

