为什么要学算法呢?有一句话是程序=算法+数据结构,学完算法以后能够将很多问题简单化,使你的程序耗时更短,占据更小的内存,提升编码能力
题目:给你一个整数数组 nums= [5,2,3,1],请你将该数组升序排列。
1、冒泡排序
var sortArray = function(nums) {
let len = nums.length
if(len <= 1){
return nums
}
for(let i = 0; i< len-1; i++){
for(let j= 0; j < len-1-i; j++){
if(nums[j] > nums [j+1]){
[nums[j], nums[j+1]] = [nums[j+1], nums[j]]
}
}
}
return nums
};
2、选择排序
var sortArray = function(nums) {
let len = nums.length
if(len <=1 ){
return nums
}
for(let i=0; i<len-1; i++){
let minIndex = i
for(let j= i+1; j<len; j++){
if(nums[j] < nums[minIndex]){
minIndex = j
}
}
if(minIndex!==i){
[nums[minIndex], nums[i]] = [nums[i], nums[minIndex]]
}
}
return nums
};
3、插入排序
var sortArray = function(nums) {
let len = nums.length
if(len ===1 ){
return nums
}
for(let i=1; i<len; i++){
for(let j=i; j>0 && (nums[j] < nums[j-1]); j--){
[nums[j], nums[j-1]] = [nums[j-1], nums[j]]
}
}
return nums
};
4、希尔排序
var sortArray = function(nums) {
let len = nums.length
if(len <= 1){
return nums
}
function swap(a,i,j){
[a[i], a[j]] = [a[j], a[i]]
}
let h = 1
while(h< len/3){
h = 3*h+1
}
while(h>=1){
for(let i = h; i<len; i++) {
for(let j= i; (j>=h) && nums[j] < nums[j-h]; j-=h){
swap(nums, j,j-h)
}
}
h = Math.floor(h/3)
}
return nums
};
5、快速排序
var sortArray = function(nums) {
let len = nums.length
if(len ===1 ){
return nums
}
quickSort(nums, 0, len-1)
function quickSort(nums, left, right){
if(left<right){
let pivot = partition(nums, left, right)
console.log(nums, pivot)
quickSort(nums, left, pivot-1)
quickSort(nums, pivot+1, right)
}
}
function partition(nums, left, right){
let i = left, j = right+1
let pivot = nums[left]
while(1){
// 这个循环结束的条件就是nums[++i]>=pivot
// nums[--j]>=pivot
while(nums[++i]<pivot){
if(i===right){
break
}
}
while(pivot< nums[--j]){
if(j === left){
break
}
}
// console.log('oo', i, j)
if(i>=j){
break
}
[ nums[i], nums[j]] = [ nums[j], nums[i]]
}
[nums[left], nums[j]] = [nums[j], nums[left]]
return j
}
return nums
};
6、归并排序
var sortArray = function(nums) {
function merge(left, right){
const res = []
while(left.length>0 && right.length> 0){
if(left[0]<right[0]){
res.push(left.shift())
}else{
res.push(right.shift())
}
}
return res.concat(left).concat(right)
}
function mergeSort(nums){
const len = nums.length
if(len === 1){
return nums
}
const mid = len>>1
const left = nums.slice(0, mid)
const right = nums.slice(mid)
return merge(mergeSort(left), mergeSort(right))
}
nums = mergeSort(nums)
return nums
};
7、计数排序
var sortArray = function(nums) {
let len = nums.length
if(len < 2){
return nums
}
// 5 5 2 3 1
// count = [undefined, 1 , 1, 1, undefined, 2]
let min = nums[0]
let max = nums[0]
for(let i=1; i<len; i++){
if(nums[i] < min){
min = nums[i]
}else if(nums[i] > max){
max = nums[i]
}
}
const count = new Array(max - min + 1)
for(let i=0; i<len; i++){
const j = nums[i] -min
if(count[j]){
count[j]++
}else{
count[j] = 1
}
}
const res = []
for(let j=0; j<count.length; j++){
while(count[j]>0){
res.push(j)
count[j] --
}
}
return res
};