关于冒泡排序选择排序快速排序的一些见解。
Posted asablog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于冒泡排序选择排序快速排序的一些见解。相关的知识,希望对你有一定的参考价值。
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的操作,确保中间值肯定是整数,接着利用循环将当前数组继续分为左右两个数组,依次类推。为了确保不会出现重复,循环里边的判断条件需要加一句中间值不等于当前的下标值。
以上是关于关于冒泡排序选择排序快速排序的一些见解。的主要内容,如果未能解决你的问题,请参考以下文章
php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法