let arr=[7,3,2,1,4,2,6,9,6,7]
function swap(arr,i,j){
let temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
//冒泡排序
//冒泡排序的思想是第一次比较将最大的放在最后,第二次比较只需要比较length-1次,往后每次都是比较次数比上一次少一次。所以第一个循环只是来规定第二个循环的比较次数。
// function demo(arr){
// for(let i=arr.length-1;i>=0;i--){
// for(let j=0;j<i;j++){
// if(arr[j]>arr[j+1]){
// swap(arr,j,j+1)
// }
// }
// }
// return arr
// }
//插入排序
//插入排序的原理是从第二个元素开始循环,将其拿出来和它前面的一个元素组成的数组一个一个的进行比较,遇到大的放后面,遇到小的放前面。第二个循环是从后往前比较,故j--。
// function demo(){
// for(let i=1;i<arr.length;i++){
// for(let j=i-1;j>=0;j--){
// if(arr[j]>arr[j+1]){
// swap(arr,j,j+1)
// }
// }
// }
// return arr
// }
//选择排序
//选择排序的思想是让他和自身比较,设置一个minIndex来获取最小的数值的下标。第一层的第一次循环可以选出最小的元素,第二次循环可以选出第二小的元素,故第二层循环从i+1开始,意为前面已经是小元素了,再比的话又会重新交换,所以避开。
// function demo(arr){
// for(let i=0;i<arr.length;i++){
// let minIndex=i;
// for(let j=i+1;j<arr.length;j++){
// minIndex=arr[j]<arr[minIndex]?j:minIndex;
// }
// swap(arr,i,minIndex)
// }
// return arr
// }
//快排
//快排的思想是拿出当前数组的中间值,让剩余值与该值比较,小的放到左空数组里,大的放到右空数组里让后把左右数组合并,依次递归。当当前数组长度小于等于1时返回数组。
// function demo(arr){
// if(arr.length<=1){return arr}
// let mid=Math.floor(arr.length/2);
// let index=arr.splice(mid,1)[0];
// let left=[];
// let right=[];
// for(let i=0;i<arr.length;i++){
// if(arr[i]<index){
// left.push(arr[i])
// }
// else{
// right.push(arr[i])
// }
// }
// return demo(left).concat(index,demo(right));
// }
//冒泡排序的优化:有的时候排序早已经拍好了,但还是要往下进行。可以设置一个flag,当一次大循环里没有进行swap操作时证明已经排好序了。此时使用flag来进行判断,如果flag的值没有发生变化,证明已经排好序了,就跳出循环。
function demo(arr){
let x=0
let border=arr.length-1;
for(let i=arr.length-1;i>=0;i--){
let flag=true;//初始值设置为true
for(let j=0;j<border;j++){
if(arr[j]>arr[j+1]){
swap(arr,j,j+1)
x=j
flag=false;
}
}
if(flag){//当大循环里未调用swap时,表明已经排好序,使用break直接跳出循环即可。
border=x
break;
}
}
return arr
}
console.log(demo(arr))
console