关于冒泡排序、选择排序、快速排序的一些见解。

1、冒泡排序:
function maopao(arr) {
  var temp;
  for (i = 0; i < arr.length - 1; i++) {
    for (j = 0; j < arr.length - 1 - i; j++) {
      if (arr[j] > arr[j + 1]) {
        temp = arr[j + 1];
        arr[j + 1] = arr[j];
        arr[j] = temp;
      }
    }
  }
  return arr;
}
var arr = [10, 209, 30, 4, 57]
console.log(maopao(arr));
 
冒泡排序使用的逻辑是两两进行比较,先选出最后一位,然后在外围循环第二轮开始之后,对比继续从下标为0的值开始两两比较,继续选出当前循环的最大值,依次类推。因为下标的最大值是arr.length-1,所以,外面的循环次数是下标的长度。在第一轮结束之后,第二轮照样是从下标为0的值开始对比,因此内循环的初始值为0,在i进行了增加之后,还想像原来一样的模式循环,则需要减去每次添加的i,内部外部双管齐下,一步步排除每次循环的最值,最后得出结果
 
2、选择排序:
function xuanze(arr) {
  var temp;
  for (i = 0; i < arr.length - 1; i++) {
    for (j = i + 1; j < arr.length; j++) {
      if (arr[i] > arr[j]) {
        temp = arr[j];
        arr[j] = arr[i];
        arr[i] = temp;
      }
    }
  }
  return arr;
}
var arr = [19, 3, 4, 324, 6, 45]
console.log(xuanze(arr));
 
选择排序又叫打擂台,是将每一轮最靠前的下标的值与其它位置的值进行对比,因此内部循环的初始下标为i+1,因为在对比的时候,不会和自己进行比较,没有意义。每个小循环将当前数组内最靠前的下标的值与其它值进行对比,若符合条件则交换位置,因此每轮小循环都会选出当前的排第一的值,在选出第一之后,下面的循环没有必要将他再与其它值进行比较,因此外层循环确定的是每个大循环的确认下标的位置,内循环则是从他的+1的位置开始向后进行比较。最初的时候是所有的值进行比较,依次类推,因此可以将所有轮循环的下标为0的值进行剔除,内循环的上限是数组的长度。
 
3、快速排序
function quickly(arr) {
  if (arr.length < 2) {
    return arr;
  }
  var left = [];
  var right = [];
  var mid;
  if (arr.length % 2 != 0) {
    mid = (arr.length + 1) / 2;
  } else {
      mid = arr.length / 2;
  }
  var leg = arr[mid];
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] < arr[mid] && mid != i) {
      left.push(arr[i]);
    } else if (arr[i] >= arr[mid] && mid != i) {
      right.push(arr[i])
    }
  }
  return quickly(left).concat(leg).concat(quickly(right));
}
var arr = [12, 3, 45, 6, 3, 5, 6]
console.log(quickly(arr));
 
快速排序是从中间划分大小,大小分开两边,建立两个单独的数组,然后在单独的数组中进行递归,使每个数都被单独分开,最后将左中右三部分进行拼接导出最终的数据。递归停止的条件是每个数都单独被划分出来,也就是函数内数组的长度小于2。在确定中间值的时候,为了防止是奇数造成漏洞,可以先去判断当前数组的个数,若是奇数则进行(+1)/2的操作,确保中间值肯定是整数,接着利用循环将当前数组继续分为左右两个数组,依次类推。为了确保不会出现重复,循环里边的判断条件需要加一句中间值不等于当前的下标值。

猜你喜欢

转载自www.cnblogs.com/asablog/p/10659516.html
今日推荐