排序方法总结

// 冒泡排序
// 冒泡排序思想:每一次对比相邻两个数据的大小,小的排在前面,如果前面的数据比后面的大就交换这两个数的位置
// 要实现上述规则需要用到两层for循环,和假设成立法

// 优化高级版:
// (1) 如果数组, 默认已经排好序了, 其实后面就不用排了
// (2) 如果数组, 排了一趟之后, 排好序了, 后面也不用排序了 ...
// (假设成立法)
var arr = [1, 2, 3, 4, 5, 6, 7]; // 7个数
var count = 0;
for (var j = 0; j < arr.length - 1; j++) {// 外层 for 循环, 控制趟数, 7个数, 6趟即可
var flag = true;// 在每一趟比较的前面, 假设这个数组已经排好序了
for (var i = 0; i < arr.length - 1 - j; i++) {// 一趟可以比出一个最大值
count++;
if (arr[i] > arr[i + 1]) { // 让 arr[i] 和 arr[i+1] 比较
var temp = arr[i]; // 交换位置
arr[i] = arr[i + 1];
arr[i + 1] = temp;
// 只要发生了交换位置, 说明肯定没排好
flag = false;
} // flag false 说明发生了交换位置, 肯定没排好, 继续排下一趟
} // flag true 说明一次交换都没有发生, 说明排好了, 后面的趟数不用排了
if (flag === true) {
break; // 排好了
}
}
console.log(arr);
console.log(count);

// -------------------------------------------------------------------------------------

// 快速排序思想:先找到一个基准点(一般指数组的中部,可以选取第一个,或者最后一个数为基准),
// 然后数组被该基准点分为两部分,依次与该基准点数据比较,如果比它小,放左边;反之,放右边。
// 左右分别用一个空数组去存储比较之后的数据。最后递归执行上述操作,直到数组长度<=1;

// 快速排序
// 特点:快速,常用。缺点是需要另外声明两个数组,浪费了内存空间资源。

// arr.splice ():可以在数组的任意位置,添加 ,删除 , 替换 任意项,涉及到增删操作,所以会改变原数组,返回的是新的数组
// splice(begin,deletecounts,item1,item2 。。。。)
// 第一个参数是从哪开始删的下标,删几个,添加的项1,添加的项2.。。。

// arr.concat(arr1,arr2,arr3...) 可以合并几个数组,返回的是一个新的数组

// 思路:取出中间数,数组每次和中间数比较,小的放到左边,大的放到右边。
// var arr = [3,1,6,4,2,5,7];
// function quickSort(arr) {
// //如果数组<=1,则直接返回
// if(arr.length<=1){
// return arr;
// }

// //找基准,并把基准从原数组删除,找到中间值
// var pivotIndex = Math.floor(arr.length / 2); //基准点的下标
// // console.log(pivotIndex);
// var pivot=arr.splice(pivotIndex,1)[0];
// // console.log(pivot);


// //定义左右数组
// var left = [];
// var right = [];

//   //遍历数组,进行判断分配,比基准小的放在left,比基准大的放在right
// for (var i = 0; i < arr.length; i++) {
// if(arr[i] < pivot) {
// left.push(arr[i]);
// } else {
// right.push(arr[i]);
// }
// }

//   //递归执行以上操作,对左右两个数组进行操作,直到数组长度为<=1;
// return quickSort(left).concat([pivot], quickSort(right));
// }
// console.log(quickSort(arr));

//[1, 2, 3, 4, 5, 6, 7]

/*
* 1.基准为4时,第一次分区得到左右两个子集[ 3, 1, 2] 4 [6, 5, 7];
* 2.先对左边的数组进行排序,基准为1,对左边的子集[3,2]进行排序,得到[2] 3。左子集排序结果:1,2,3
* 3.再对右边的数组进行排序,基准为5,对右边的子集[6,7]进行排序,得到[6],7.右子集排序结果:5,6,7
* 4.数组的合并 1,2,3,4,5,6,7
*/
 
// -------------------------------------------------------------------------------------

// 插入排序法的原理
// 原理是每插入一个数都要将它和之前的已经完成排序的序列进行重新排序,也就是要找到新插入的数对应原序列中的位置。那么也就是说,每次插入一个数都要对原来排序好的那部分序列进行重新的排序。

// 从小到大排序
// var array = [2, 5, 7, 3, 1, 8, 4, 6, 9];

// 第一趟
// 用数组的第二个数与第一个数比较
// 如果比第一个数大,那就不管他
// 如果比第一个数小,将第一个数往后退一步,将第二个数插入第一个数去
// 用数组的第三个数与已是有序的数据{2,3}(刚才在第一趟排的)比较

// 第二趟
// 用第三个数和前两个数比较
// 如果比第二个数大,那就不管它
// 如果比第二个数小,那就将第二个数退一个位置,让第三个数和第一个数比较
// 如果第三个数比第一个数大,那么将第三个数插入到第二个数的位置上
// 如果第三个数比第一个数小,那么将第一个数后退一步,将第三个数插入到第一个数的位置上
// ......依次下去
// for (var i = 1; i < array.length; i++) {
// var temp = array[i];
// for (var j = i - 1; j >= 0; j--) {
// //将大于temp的数向后移动一步
// if (array[j] > temp) {
// array[j + 1] = array[j];//记录j的值也就是temp要插入的位置
// } else {
// break;
// }
// }
// array[j + 1] = temp;
// }
// console.log(array);
posted @ 2019-06-22 20:41  柚稚人儿  阅读(203)  评论(0编辑  收藏  举报