复习一下js的冒泡排序和快速排序,以及犯的错误;
- 冒泡排序:两层for循环进行遍历;逐个比较,大的放右边。
在这里插入代码片//冒泡排序
let arr = [];
for(let i = 0; i < 300; i++){
arr[i] = Math.floor(Math.random()*300 + 1);
}
function sort2(array){
for(let i = 0; i < array.length; i++){
for(let j = 1+i ; j< array.length; j++){
if(array[i] > array[j]){
exchange(array,i,j);
}
}
}
//console.log(array);
}
用于交换素组内容的方法:
function exchange(arrr,x,y){
arrr[x] = arrr[x]+arrr[y];
arrr[y] = arrr[x]-arrr[y];
arrr[x] = arrr[x]-arrr[y];
}
为了将两种排序的快慢进行比较,我们需要获取执行前的时间和执行后的时间。(单位ms)。
let time1 = new Date().getTime();
sort2(arr);
let time2 = new Date().getTime();
console.log(time2 - time1);
- 快速排序:取参考值(我是以数组的第一项作为参考的),然后对整个数组进行遍历,与参考值进行比较。(新建两个空数组 L ,R)比他大的或者等于他的放右边,比他小的放左边,递归地对左右数组进行相同处理,左右数组返回后使用array.concat()进行拼接。问题出现的地方,如果不把参考项挖出来,就会出现下面这种情况:
[5,2,8,9,6,3,4]
[2,3,4] — [5,8,9,6]
[ ]–[2,3,4] —[ ]–[5,8,9,6]
发现了吗,右边的数组将不会减少,最后我们使用递归的时候就会直接栈溢出。所以我们要用splice方法把原数组挖出参考项。
这是错误代码:
function sort1(arry){
if(arry.length <= 1){
return arry;
}
let x1 = arry[0];
let L = [], R = [];
for( let i = 0 ; i < arry.length; i++){
if(arry[i] < x1){
L.push(arry[i]);
}
else{
R.push(arry[i]);
}
}
return sort1(L).concat(x1,sort1(R));
}
加一句splice后就正确了:
function sort1(arry){
if(arry.length <= 1){//如果数组只剩一项就不用排序了。
return arry;
}
let x1 = arry.splice(0,1);//把取出的参考值赋给x1,原数组将少一项。
//console.log(x1);
let L = [], R = [];
for( let i = 0 ; i < arry.length; i++){
if(arry[i] < x1){
L.push(arry[i]);
}
else{
R.push(arry[i]);
}
}
//console.log(L , R);
return sort1(L).concat(x1,sort1(R));
}
本人2020年毕业萌新一枚,第一次发文,有不足的地方希望各位大佬多多指正。