没有经过总结的知识是沉重的,无用的
就像气泡在水中上浮一样,两个数比较大小,较大的数下沉,较小的数冒起来。
平均时间复杂度: O(n2)
代码:
var sortArray = function(nums) {
var swap = function (i, j) {
var temp = 0
temp = nums[i]
nums[i] = nums[j]
nums[j] = temp
}
for(let i = 0;i < nums.length; i++){
for(let j = 0;j < nums.length; j++){
if(nums[i] < nums[j]){
swap(i, j)
}
}
}
return nums
};
优化:
-1
思路
len
的无序数组中,第一次遍历len-1
个数,找到最小的数值与第一个元素交换;len-2
个数,找到最小的数值与第二个元素交换;平均时间复杂度:O(n2)
代码:
var selectSort = function(nums) {
var temp = 0
for (let i = 0; i < nums.length - 1; i++) {
var min = i
for (let j = i + 1; j < nums.length; j++) {
if (nums[min] > nums[j]) {
min = j
}
}
if (min !== i) {
temp = nums[i]
nums[i] = nums[min]
nums[min] = temp
}
}
return nums
}
图解
前言:
数据序列1: 13-17-20-42-28
利用插入排序,13-17-20-28-42.
Number of swap:1;
数据序列2: 13-17-20-42-14
利用插入排序,13-14-17-20-42.
Number of swap:3;
如果数据序列基本有序,使用插入排序会更加高效。
基本思想:
过程:
var sortArray = function(nums) {
var temp = 0
for(let i = 0; i < nums.length-1; i++){
for(let j = i+1; j >=0; j--){
if(nums[j] < nums[j-1]){
temp = nums[j-1]
nums[j-1] = nums[j]
nums[j] = temp
}
}
}
return nums
};
leetCode结果: 很遗憾经常超时。。。
基本思想:
代码:
function sortArray(nums) {
var N = nums.length;
var h = 1;
while (h < N / 3) {
h = 3 * h + 1; //设置间隔
}
while (h >= 1) {
for (var i = h; i < N; i++) {
for (j = i; j >= h && nums[j] < nums[j - h]; j -= h) {
swap(nums, j, j - h);
}
}
h = (h - 1) / 3;
}
return nums
}
function swap(array, i, j) { //两个数调换
var temp = array[j];
array[j] = array[i];
array[i] = temp;
}
基本思想:
先实现第一点,将两个已经排序的数组合并 合并已经排序的数组-题解传送门
var merge = function(A, m, B, n) {
// m = A.length n = B.length
var a = 0, b = 0;
var arr = []
while(a < m || b < n){
if(a === m){
arr.push(B[b++])
}else if(b === n){
arr.push(A[a++])
}else if(A[a] < B[b]){
arr.push(A[a++])
}else{
arr.push(B[b++])
}
}
};
之后就讲一个数组拆分为2、4、6,直至每个数组的元素个数为1,再进行两两合并
过程:
平均时间复杂度:O(NlogN)
代码:
// 融合两个有序数组,这里实际上是将数组 arr 分为两个数组
function mergeArray(arr, first, mid, last, temp) {
let i = first;
let m = mid;
let j = mid+1;
let n = last;
let k = 0;
while(i<=m && j<=n) {
if(arr[i] < arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
while(i<=m) {
temp[k++] = arr[i++];
}
while(j<=n) {
temp[k++] = arr[j++];
}
for(let l=0; l<k; l++) {
arr[first+l] = temp[l];
}
return arr;
}
// 递归实现归并排序
function mergeSort(arr, first, last, temp) {
if(first<last) {
let mid = Math.floor((first+last)/2);
mergeSort(arr, first, mid, temp); // 左子数组有序
mergeSort(arr, mid+1, last, temp); // 右子数组有序
arr = mergeArray(arr, first, mid, last, temp);
}
return arr;
}
// example
let arr = [10, 3, 1, 5, 11, 2, 0, 6, 3];
let temp = new Array();
let SortedArr = mergeSort(arr, 0 ,arr.length-1, temp);
alert(SortedArr);
基本思想:(分治)
代码:
var sortArray = function(arr) {
let pivot = arr[0]
let left = []
let right = []
if (arr.length < 2) return arr
for (let i = 1; i < arr.length; i++) {
arr[i] < pivot ? left.push(arr[i]) : right.push(arr[i])
}
return sortArray(left).concat([pivot], sortArray(right))
};
参考阮一峰大佬的版本
var quickSort = function(arr) {
if (arr.length <= 1) { return arr; }
var mid = arr.length>>1
var pivot = arr.splice(mid, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++){
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
};
未完待续…