快排
找到一个基准temp,经过一次遍历使比temp小的都在temp左边,比temp大的都在temp右边,这样temp就找到了在原数组中的位置。之后再分别对左边部分和右边部分做重复操作。
快速排序不是稳定排序,稳定排序即排序前后相同大小的数字位置不发生变化。
function quicksort(arr, low, high){
var left, right, temp
left = low
right = high
if(low < high){
temp = arr[low]
while(left != right){
while(arr[right] >= temp && right > left){
right--
}
if(left < right){
arr[left] = arr[right]
left++
}
while(arr[left] <= temp && left < right){
left++
}
if(left < right){
arr[right] = arr[left]
right--
}
}
arr[left] = temp
quicksort(arr, low, left - 1)
quicksort(arr, left + 1, high)
}
}
归并排序
采用分治的思想,分别将左边部分和右边部分排好序,再将这两部分合并在一起。当问题分成足够小时就是左右均为一个数字然后这两个数字通过一次比较大小实现归并merge。
归并排序是稳定排序。
function merge(arr, left, mid, right){
let arr1 = [],arr2 = []
for(let i = 0; i < mid - left + 1; i++){
arr1[i] = arr[i + left]
}
//arr1 = arr.slice(left, mid + 1)
for(let j = 0;j < right - mid; j++){
arr2[j] = arr[j + mid + 1]
}
// arr2 = arr.slice(mid + 1, right + 1)
let m = 0,n = 0
while(left <= right){
if((arr1[m] < arr2[n] && m < arr1.length) || n == arr2.length){
arr[left] = arr1[m]
m++
}
else if((arr1[m] >= arr2[n] && n < arr2.length) || m == arr1.length){
arr[left] = arr2[n]
n++
}
left++
}
}
var array = [9,4,2,1,3,6,2,8,12,-3]
function mergesort(arr, left, right){
if(left < right){
let mid = parseInt((left + right) / 2)
mergesort(arr, left, mid)
mergesort(arr, mid + 1, right)
merge(arr, left, mid, right)
}
}
mergesort(array, 0, array.length - 1)