冒泡排序

  1. function createArr(num) {
  2. let arr = new Array(num)
  3. for (let i = 0; i < num; i++) {
  4. arr[i] = Math.ceil(Math.random() * 10000);
  5. }
  6. return arr
  7. }
  8. function bubbleSort(arr) {
  9. console.time()
  10. let temp = 0 //临时存放元素的变量
  11. let flag = false //表示本次冒泡有无变换位置
  12. for (let i = 0; i < arr.length - 1; i++) {
  13. for (let j = 0; j < arr.length - 1 - i; j++) {
  14. if(arr[j]>arr[j+1]){
  15. temp = arr[j]
  16. arr[j] = arr[j + 1]
  17. arr[j + 1] = temp
  18. flag = true
  19. }
  20. }
  21. if (flag) {
  22. flag = false
  23. } else {
  24. break
  25. }
  26. }
  27. console.timeEnd()
  28. return arr
  29. }
  30. let targetArr = createArr(80000)
  31. bubbleSort(targetArr)

插入排序

  1. function createArr(num) {
  2. let arr = new Array(num)
  3. for (let i = 0; i < num; i++) {
  4. arr[i] = Math.ceil(Math.random() * 10000);
  5. }
  6. return arr
  7. }
  8. function insertSort(arr) {
  9. console.time()
  10. let val = 0 //存放有序数组的最后一个数,即要插入的数
  11. for (let i = 1; i < arr.length; i++) {
  12. val = arr[i]
  13. for (let j = i - 1; j > -1; j--) { //比当前数小,当前数往后移
  14. if (val < arr[j]) {
  15. arr[j + 1] = arr[j]
  16. }else {
  17. arr[j+1]=val //找到插入位置 跳出循环
  18. break
  19. }
  20. if(j===0&&val < arr[j]){ //到第一位,且插入数比第一位小,说明要插到第一位
  21. arr[j]=val
  22. }
  23. }
  24. }
  25. console.timeEnd()
  26. return arr
  27. }
  28. let targetArr = createArr(80000)
  29. insertSort(targetArr)

希尔排序

  1. function createArr(num) {
  2. let arr = new Array(num)
  3. for (let i = 0; i < num; i++) {
  4. arr[i] = Math.ceil(Math.random() * 10000);
  5. }
  6. return arr
  7. }
  8. function shellSort(arr) {
  9. console.time()
  10. let temp = 0
  11. for (let gap = Math.floor(arr.length / 2); gap > 0; gap = Math.floor(gap / 2)) {
  12. for (let i = gap; i < arr.length; i++) { //从第一组的第一个元素开始用插入法
  13. temp = arr[i]
  14. for (let j = i - gap; j > -1; j -= gap) { //按组遍历
  15. if (temp < arr[j]) {//比当前数小,当前数往后移
  16. arr[j + gap] = arr[j]
  17. } else {
  18. arr[j + gap] = temp//找到插入位置 跳出循环
  19. break
  20. }
  21. if ((j-gap)<0 && temp < arr[j]) { //到第一位,且插入数比第一位小,说明要插到第一位
  22. arr[j] = temp
  23. }
  24. }
  25. }
  26. }
  27. console.timeEnd()
  28. return arr
  29. }
  30. let targetArr = createArr(80000)
  31. shellSort(targetArr)

快速排序

  1. function createArr(num) {
  2. let arr = new Array(num)
  3. for (let i = 0; i < num; i++) {
  4. arr[i] = Math.ceil(Math.random() * 10000);
  5. }
  6. return arr
  7. }
  8. function quickSort(arr) {
  9. console.time()
  10. _quickSort(0, arr.length - 1)
  11. function _quickSort(left, right) {
  12. let l = left //左下标 l的左边必须是小于pivor的元素
  13. let r = right //右下标 r的右边必须是大于pivot的元素
  14. const pivotIndex = Math.floor((l + r) / 2)
  15. const pivot = arr[pivotIndex] // 标准值
  16. let temp = 0 //辅助变量
  17. while (l < r) { //循环一遍 完毕的时候实现pivot左边都是比它小的数
  18. while (arr[l] < pivot) { //从左边开始找,跳出循环的时候说明找到了比pivot大的元素
  19. l++
  20. }
  21. while (arr[r] >= pivot) { // 从右边开始找,跳出循环说明找到了比pivot小的元素
  22. r--
  23. }
  24. if (l > r) { //当条件成立,说明已经达成循环目标,相等时往下走,因为此时l要加1
  25. break
  26. }
  27. temp = arr[l]
  28. arr[l] = arr[r]
  29. arr[r] = temp
  30. r--
  31. l++
  32. }
  33. if (l === left && pivot === arr[pivotIndex]) { ///说明没有变化
  34. temp = arr[l]
  35. arr[l] = arr[pivotIndex]
  36. arr[pivotIndex] = temp
  37. l++
  38. }
  39. if (l < right) {// 右边部分超过两个需要排序
  40. _quickSort(l, right)
  41. }
  42. if (l > left + 1) { // 左边部分超过两个就需要排序
  43. _quickSort(left, l - 1)
  44. }
  45. }
  46. console.timeEnd()
  47. return arr
  48. }
  49. let arr = createArr(80000)
  50. quickSort(arr)