用的找到最大值,最小值的筛选逻辑

性能上暂时没有比较的例子,因为用的数组,它的删除操作,性能肯定会很低的。

  1. const arr = [];
  2. for (let i = 0; i < 30; i++) {
  3. arr.push(Math.round(Math.random() * 100));
  4. }
  5. class Sort {
  6. constructor(data) {
  7. this.data = [...data];
  8. this.min = [];
  9. this.max = [];
  10. }
  11. loop() {
  12. const {data} = this
  13. let min = data[0], max = data[0];
  14. let minIndex = 0, maxIndex = 0;
  15. data.map(
  16. (num, ind) => {
  17. if (num > max) {
  18. max = num;
  19. maxIndex = ind;
  20. }
  21. if (num < min) {
  22. min = num;
  23. minIndex = ind;
  24. }
  25. }
  26. );
  27. this.min.push(min);
  28. this.max.unshift(max);
  29. const larger = minIndex > maxIndex ? minIndex : maxIndex;
  30. const small = minIndex < maxIndex ? minIndex : maxIndex;
  31. data.splice(larger,1); //这里的性能有损耗,最好的方法是用双链表
  32. data.splice(small,1);
  33. while(data.length>1){
  34. this.loop()
  35. }
  36. if (data.length === 1){
  37. this.min.push(data[0])
  38. }
  39. }
  40. }
  41. const sort = new Sort(arr)
  42. sort.loop()
  43. console.log(arr,sort);

优化——然后我又突发奇想,觉得可以用赋值来代替删除这种损耗性能的操作。同时,我又增加了,如果匹配到相等的结果最大值或最小值,同时纳入控制。

基本思路就是,每次循环遍历,都找到最大值和最小值的所有位置。然后最小值们依次跟第0,1,2,,,位的数字交换位置。交换了位置,记录好当前最小值占了第几位了,下次循环和交换从它们的占位的下一位开始搞。同理,最大值就是反过来操作的。如此的性能应该会很好了。

这里有问题!错误方法!后面的排序算法里我纠正了!

  1. const arr = [];
  2. for (let i = 0; i < 30; i++) {
  3. arr.push(Math.round(Math.random() * 100));
  4. }
  5. class Sort {
  6. constructor(data) {
  7. this.data = [...data];
  8. this.min = [];
  9. this.max = [];
  10. this.left = 0;
  11. this.right = data.length - 1;
  12. }
  13. loop1() {
  14. const {data} = this;
  15. let min = data[this.left], max = data[this.left];
  16. let minIndex = [this.left], maxIndex = [this.left];
  17. for (let i = this.left; i <= this.right; i++) {
  18. if (data[i] > max) {
  19. max = data[i];
  20. maxIndex = [i];
  21. } else if (data[i] === max && i !== this.left) {
  22. maxIndex.push(i);
  23. }
  24. if (data[i] < min) {
  25. min = data[i];
  26. minIndex = [i];
  27. } else if (data[i] === min && i !== this.left) {
  28. minIndex.push(i);
  29. }
  30. // console.log(minIndex,min,max,maxIndex)
  31. }
  32. if (max === min) return;
  33. minIndex.map( //这里有问题,一旦要替换的位置的数据是当前的最大值,也就是maxIndex里的数,,,
  34. ind => {
  35. if (ind !== this.left) {
  36. const leftVal = data[this.left];
  37. const indVal = data[ind];
  38. const index = this.maxIndex.indexOf(this.left)
  39. (index >=0 && this.maxIndex[index] = ind) //修补错误,未验证!
  40. data[this.left] = indVal;
  41. data[ind] = leftVal;
  42. }
  43. this.left += 1;
  44. }
  45. );
  46. maxIndex.map(
  47. ind => {
  48. if (ind !== this.right) {
  49. const rightVal = data[this.right];
  50. const indVal = data[ind];
  51. data[this.right] = indVal;
  52. data[ind] = rightVal;
  53. }
  54. this.right -= 1;
  55. }
  56. );
  57. while(this.right-this.left>1){
  58. this.loop1()
  59. }
  60. }
  61. }
  62. const sort = new Sort(arr);
  63. // sort.loop();
  64. // console.log(arr, sort);
  65. sort.loop1()
  66. console.log(sort.data)