选择排序

    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 selectSort(arr) {
    9. console.time();
    10. let min = 0; //存放最小值
    11. let minIndex = 0; //寻找最小值的下标
    12. for (let i = 0; i < arr.length - 1; i++) {
    13. min = arr[i];
    14. minIndex = i;
    15. for (let j = i + 1; j < arr.length; j++) {
    16. if (min > arr[j]) {
    17. min = arr[j];
    18. minIndex = j;
    19. }
    20. }
    21. if (i !== minIndex) {
    22. //若有比第i个数小的数则交换
    23. arr[minIndex] = arr[i];
    24. arr[i] = min;
    25. }
    26. }
    27. console.timeEnd();
    28. }
    29. let targetArr = createArr(80000);
    30. selectSort(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 mergeSort(arr) {
    9. console.time()
    10. _mergeSort(0, arr.length - 1)
    11. function _mergeSort(left, right) {
    12. if (left < right) { //假如当前数组长度大于1,有分解空间
    13. let mid = Math.floor((left + right) / 2)
    14. _mergeSort(left, mid)
    15. _mergeSort(mid + 1, right)
    16. // 这个地方代表left到mid的顺序已经排好 mid+1到right的顺序排好
    17. let tempArr = new Array(right - left + 1)
    18. let i = left
    19. let j = mid + 1
    20. let t = 0
    21. while (i <= mid && j <= right) { //当其中一个有序段已经复制完毕,跳出循环,剩下的数据均为比该序列的数大
    22. if (arr[i] <= arr[j]) {
    23. tempArr[t] = arr[i]
    24. i++
    25. } else {
    26. tempArr[t] = arr[j]
    27. j++
    28. }
    29. t++
    30. }
    31. while (i <= mid) { //左序列剩余数加到数组
    32. tempArr[t] = arr[i]
    33. t++
    34. i++
    35. }
    36. while (j <= right) { //右边序列剩余数加到数组
    37. tempArr[t] = arr[j]
    38. t++
    39. j++
    40. }
    41. let tempLeft = left //把新数组的数据复制到原数组上
    42. while (tempLeft <= right) {
    43. arr[tempLeft] = tempArr[tempLeft - left]
    44. tempLeft++
    45. }
    46. }
    47. }
    48. console.timeEnd()
    49. }
    50. let arr = createArr(80000)
    51. mergeSort(arr)

    基数排序

    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 radixSort(arr, size) { //size代表数字的最大位数
    9. console.time()
    10. let bucket = new Array(10) //创建十个桶,代表数位0到9
    11. let bucketCount = new Array(10) //记录每个桶里面有多少数据
    12. for (let i = 0; i < 10; i++) {
    13. bucket[i] = new Array(arr.length)
    14. bucketCount[i] = 0
    15. }
    16. for (let i = 0; i < size; i++) {
    17. let divisor = Math.pow(10, i )
    18. let base = Math.pow(10, i+1 ) //用这个基取模,出来除以divisor,得出的值的整数部分就是第i+1位的数
    19. for (let j = 0; j < arr.length; j++) { //根据i+1位数放进桶内
    20. let index=Math.floor(arr[j] % base/divisor)
    21. bucket[index][bucketCount[index]] = arr[j] //假设第i+1位数是1,代表第1个桶添加一个数进去,同时这个桶计数加1
    22. bucketCount[index]++
    23. }
    24. let count=0
    25. for (let j in bucketCount) { //把桶里的数复制到原数组
    26. for (let index=0;index<bucketCount[j];index++){
    27. arr[count]=bucket[j][index]
    28. count++
    29. }
    30. bucketCount[j]=0 //归零,桶里的数已经复制到数组里面,桶内的逻辑空间为0
    31. }
    32. }
    33. console.timeEnd()
    34. }
    35. let arr=createArr(80000)
    36. radixSort(arr,4)