首页 > 其他分享 >js-基础排序实现(冒泡排序,快速排序,选择排序,插入排序,希尔排序,归并排序,堆排序)

js-基础排序实现(冒泡排序,快速排序,选择排序,插入排序,希尔排序,归并排序,堆排序)

时间:2022-10-29 16:34:32浏览次数:54  
标签:function 堆排序 list 冒泡排序 let largest 排序 left

冒泡排序

:两个指针循环,遇到不合适就交换,直到将符合要求的浮到边界

function bubbleSort(list){
	for(let i=0;i<list.length;i++){
		for(let j=0;j<list.length-i-1;j++){
			if(list[j]>list[j+1]){
				let tmp=list[j]
				list[j]=list[j+1]
				list[j+1]=tmp
			}
		}
	}
}

快速排序

function swap(list , i ,j){
	let tmp=list[i]
	list[i]=list[j]
	list[j]=tmp
}
// function partition(list,left,right){
//     let index=left+1
//     let piovt=list[left]
//     for(let i=index;i<=right;i++){
//         if(list[i]<piovt){
//             swap(list,index++,i)
//         }
//     }
//     swap(list,left,index-1)
//     return index-1
// }

function partition(list,left,right){
	let pivot=list[left]
	while(left<right){
		while(left<right&&list[right]>pivot){
			right--
		}
		list[left]=list[right]
		while(left<right&&list[left]<=pivot){
			left++
		}
		list[right]=list[left]
	}
	list[left]=pivot
	return left
}
function quickSort(list,left,right){
	if(left<right){
		let pivot=partition(list,left,right)
		quickSort(list,left,pivot-1)
		quickSort(list,pivot+1,right)
	}
}

选择排序

function selectSort(list){
	for(let i=0;i<list.length;i++){
		let min=i
		for(let j=i+1;j<list.length;j++){
			if(list[min]>list[j]){
				min=j
			}
		}
		let tmp=list[i]
		list[i]=list[min]
		list[min]=tmp
	}
}

插入排序

function insertSort(list){
	for(let i=1;i<list.length;i++){
		let key=list[i]
		let j
		for(j=i-1;(j>=0)&&(key>list[j]);j--){
			list[j+1]=list[j]
		}
		list[j+1]=key
	}
}

希尔排序

function shellSort(list){
	let gap=1
	while(gap<list.length/3){
		gap=gap*3+1
	}
	for(gap;gap>0;gap=Math.trunc(gap/3)){
		for(let i=gap;i<list.length;i+=1){
			let key=list[i],j
			for(j=i-gap;list[j]>list[j+gap];j-=gap){
				list[j+gap]=list[j]
			}
			list[j+gap]=key
		}
	}
}

归并排序

function merge(left,right){
	let res=[]
	while(left.length&&right.length){
		if(left[0]<right[0]){
			res.push(left.shift())
		}else{
			res.push(right.shift())
		}
	}
	while(left.length){
		res.push(left.shift())
	}
	while(right.length){
		res.push(right.shift())
	}
	return res
}
function mergeSort(list){
	if(list.length<2){
		return list
	}
	let mid=Math.trunc(list.length/2)
	return merge(mergeSort(list.slice(0,mid)),mergeSort(list.slice(mid)))
}

堆排序

//完全二叉树,第一个非叶子节点index=n/2-1
//父节点index=(n-1)/2
//子节点index=n2+1 n2+2

function heapfy(list,i,len){
	let left=i*2+1
	let right=i*2+2
	let largest=i
	if(left<len&&list[left]>list[largest]){
		largest=left
	}
	if(right<len&&list[right]>list[largest]){
		largest=right
	}
	if(i!=largest){
		swap(list,largest,i)
		heapfy(list,largest,len)
	}
}
function heapSort(list){
	for(let i=Math.trunc((list.length-1)/2);i>=0;i--){
		heapfy(list,i,list.length)
	}
	for(let i=list.length-1;i>0;i--){
		swap(list,0,i)
		heapfy(list,0,i)
	}
	return list
}

标签:function,堆排序,list,冒泡排序,let,largest,排序,left
From: https://www.cnblogs.com/badpear/p/16838989.html

相关文章

  • 冒泡排序
    <!DOCTYPEhtml><html>   <head>      <metacharset="utf-8">      <title></title>   </head>   <body>      <scripttype="text/......
  • 冒泡排序
    packageclass01;importjava.util.Arrays;/***冒泡排序*概述:每相邻的2个数比较,较大的数向后交换。排到最后一个位置时,它就是整个数组的最大值,第一轮结束。*......
  • 插入排序
    packageclass01;importjava.util.Arrays;/***插入排序*概述:先将i指向第二个数(索引为1),将j指向i-1位置,如果j大于等于0,并且arr[j]>arr[j+1],将将arr[j]和arr[j+......
  • 选择排序
    packageclass01;importjava.util.Arrays;/***选择排序*概述:n个数,n次循环(10个数就是10次循环),每次循环找出本轮的最小值,和本轮的第一个位置的数,交换。周而复......
  • 选择排序
    #include<stdio.h>#include<string.h>intmain(){inttemp=0;intflag;inta;intt;intarr[10]={};for(inti=0;i<10;i++){ scanf("%d",&a); arr[temp......
  • 【HEOI2016_TJOI2016】排序(线段树分裂&合并)
    线段树分裂&合并入门题。对于每个单调段用一个权值线段树维护。一次操作相当于先对\(l,r\)所在的单调段的权值线段树分裂,然后再合并若干棵的权值线段树。线段树分裂和......
  • 【AGC010E】Rearranging(博弈,图论,拓扑排序)
    考场上想了很久才想到做法,然后考完后又想了很久,加上看了一下一些大佬的博客和Atcoder的官方题解,才完整地证明了整个做法的正确性。综合了一下,在这里详细阐述:首先发现如......
  • 快速排序
    快速排序的思想是这样的,如果要对数组区间[p,r]的数据进行排序,我们先选择其中任意一个数据作为pivot(分支点),一般为区间最后一个元素。然后遍历数组,将小于pivot的数据......
  • C# OrderBy多个字段排序
    C#OrderBy多个字段排序先按Sort字段正序排序,再按CreateDate降序排序,如果三个字段进行排序,我才是再后面再加ThenByDescendingvarresult=_IDbConnection.Query<Query......
  • JS数组对象排序
    原文地址:https://blog.csdn.net/qq_37899792/article/details/88655920利用数组api——>sort来进行排序varperson=[{name:"Rom",age:12},{name:"Bob",age:22},{name:......