目录
- 快速排序
- 归并排序
- 计数排序
- 选择排序
- 冒泡排序
- 插入排序
快速排序
时间复杂度与空间复杂度
代码
let quickSort = (arr) => {
if(arr.length <= 1) {return arr}
let pivotIndex = Math.floor(arr.length / 2)
let pivot = arr.splice(pivotIndex,1)[0]
let left =[],right = []
for(let 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))
}
quickSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])
动图演示
归并排序
时间复杂度与空间复杂度
代码
let mergeSort = (arr) => {
if(arr.length <= 1){return arr}
let left = arr.slice(0,Math.floor(arr.length /2))
let right = arr.slice(Math.floor(arr.length /2))
return merge(mergeSort(left),mergeSort(right))
}
let merge = (a,b) => {
if(a.length === 0){return b}
if(b.length === 0){return a}
return a[0]>b[0]?
[b[0]].concat(merge(a,b.slice(1))):
[a[0]].concat(merge(a.slice(1),b))
}
mergeSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])
动画演示
计数排序
时间复杂度与空间复杂度
代码
var countSort = (arr) => {
let hashTable = [], max = 0, result = []
for(let i = 0; i < arr.length; i++){
if(!(arr[i] in hashTable)){
hashTable[arr[i]] = 1
}else{
hashTable[arr[i]] += 1
}
if(arr[i] > max) {max = arr[i]}
}
for(let j = 0;j <= max; j++){
if(j in hashTable){
for(let i = 0; i < hashTable[j]; i++){
result.push(j)
}
}
}
return result
}
countSort([2, 3, 8, 7, 1, 2, 2, 2, 7, 3, 9, 8, 2, 1, 4, 2, 4, 6, 9, 2])
动画演示
选择排序
时间复杂度与空间复杂度
代码
let swap = (array, i, j) => {
let temp = array[i]
array[i] = array[j]
array[j] = temp
}
let minIndex = (numbers) => {
let index = 0
for(let i=1; i<numbers.length; i++){
if(numbers[i] < numbers[index]){
index = i
}
}
return index
}
let selectSort = (numbers) => {
for(let i=0; i< numbers.length -1; i++){
let index = minIndex(numbers.slice(i))+ i
if(index!==i){
swap(numbers, index, i)
}
}
return numbers
}
selectSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])
let min = (numbers) => {
if(numbers.length > 2){
return min(
[numbers[0], min(numbers.slice(1))]
)
}else{
return Math.min.apply(null, numbers)
}
}
let minIndex = (numbers) => {
let index = 0
for(let i=1; i<numbers.length; i++){
if(numbers[i] < numbers[index]){
index = i
}
}
return index
}
let selectSort = (numbers) => {
if(numbers.length > 2){
let index = minIndex(numbers)
let min = numbers[index]
numbers.splice(index, 1)
return [min].concat(selectSort(numbers))
}else{
return numbers[0]<numbers[1] ? numbers :
numbers.reverse()
}
}
selectSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])
动画演示
冒泡排序
时间复杂度与空间复杂度
代码
let bubbleSort =(arr) => {
let len = arr.length;
for (let i = 0; i < len; i++) {
for (let j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) {
let temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
bubbleSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])
动画演示
插入排序
时间复杂度与空间复杂度
代码
var insertionSort = arr => {
for (var i = 1; i < arr.length; i++) {
var key = arr[i];
var j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
return arr
}
insertionSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])
动画演示