冒泡排序
function createArr(num) {let arr = new Array(num)for (let i = 0; i < num; i++) {arr[i] = Math.ceil(Math.random() * 10000);}return arr}function bubbleSort(arr) {console.time()let temp = 0 //临时存放元素的变量let flag = false //表示本次冒泡有无变换位置for (let i = 0; i < arr.length - 1; i++) {for (let j = 0; j < arr.length - 1 - i; j++) {if(arr[j]>arr[j+1]){temp = arr[j]arr[j] = arr[j + 1]arr[j + 1] = tempflag = true}}if (flag) {flag = false} else {break}}console.timeEnd()return arr}let targetArr = createArr(80000)bubbleSort(targetArr)
插入排序
function createArr(num) {let arr = new Array(num)for (let i = 0; i < num; i++) {arr[i] = Math.ceil(Math.random() * 10000);}return arr}function insertSort(arr) {console.time()let val = 0 //存放有序数组的最后一个数,即要插入的数for (let i = 1; i < arr.length; i++) {val = arr[i]for (let j = i - 1; j > -1; j--) { //比当前数小,当前数往后移if (val < arr[j]) {arr[j + 1] = arr[j]}else {arr[j+1]=val //找到插入位置 跳出循环break}if(j===0&&val < arr[j]){ //到第一位,且插入数比第一位小,说明要插到第一位arr[j]=val}}}console.timeEnd()return arr}let targetArr = createArr(80000)insertSort(targetArr)
希尔排序
function createArr(num) {let arr = new Array(num)for (let i = 0; i < num; i++) {arr[i] = Math.ceil(Math.random() * 10000);}return arr}function shellSort(arr) {console.time()let temp = 0for (let gap = Math.floor(arr.length / 2); gap > 0; gap = Math.floor(gap / 2)) {for (let i = gap; i < arr.length; i++) { //从第一组的第一个元素开始用插入法temp = arr[i]for (let j = i - gap; j > -1; j -= gap) { //按组遍历if (temp < arr[j]) {//比当前数小,当前数往后移arr[j + gap] = arr[j]} else {arr[j + gap] = temp//找到插入位置 跳出循环break}if ((j-gap)<0 && temp < arr[j]) { //到第一位,且插入数比第一位小,说明要插到第一位arr[j] = temp}}}}console.timeEnd()return arr}let targetArr = createArr(80000)shellSort(targetArr)
快速排序
function createArr(num) {let arr = new Array(num)for (let i = 0; i < num; i++) {arr[i] = Math.ceil(Math.random() * 10000);}return arr}function quickSort(arr) {console.time()_quickSort(0, arr.length - 1)function _quickSort(left, right) {let l = left //左下标 l的左边必须是小于pivor的元素let r = right //右下标 r的右边必须是大于pivot的元素const pivotIndex = Math.floor((l + r) / 2)const pivot = arr[pivotIndex] // 标准值let temp = 0 //辅助变量while (l < r) { //循环一遍 完毕的时候实现pivot左边都是比它小的数while (arr[l] < pivot) { //从左边开始找,跳出循环的时候说明找到了比pivot大的元素l++}while (arr[r] >= pivot) { // 从右边开始找,跳出循环说明找到了比pivot小的元素r--}if (l > r) { //当条件成立,说明已经达成循环目标,相等时往下走,因为此时l要加1break}temp = arr[l]arr[l] = arr[r]arr[r] = tempr--l++}if (l === left && pivot === arr[pivotIndex]) { ///说明没有变化temp = arr[l]arr[l] = arr[pivotIndex]arr[pivotIndex] = templ++}if (l < right) {// 右边部分超过两个需要排序_quickSort(l, right)}if (l > left + 1) { // 左边部分超过两个就需要排序_quickSort(left, l - 1)}}console.timeEnd()return arr}let arr = createArr(80000)quickSort(arr)
