把数组中的某个数字移到数组最后面,比如[1, 7, 0, 2, 7, 0, 4, 5]
中,把7往后挪,结果为[ 1, 0, 2, 0, 4, 5, 7, 7 ]
不想看文字就再刷一下大佬视频:https://www.bilibili.com/video/av3884468
做法一:
利用一个count计数,看碰到了几个x。如果碰到的数不是x,那么就把这个数往前挪count个单位,即
arr[i - count] = arr[i];
,相等count++
下面这张图是整个移动过程:移动所有0,zeros用来统计碰到有多少个0。
/**
* 所有相同数字后移——假设现在数字为x
* @authors heye (heye1109@qq.com)
* @date 2019-04-01 17:05:10
* @version $Id$
*/
function putBack(arr, x) {
var len = arr.length;
var count = 0;
for (var i = 0; i < arr.length; i++) {
if (arr[i] === x) {
count++;
} else {
arr[i - count] = arr[i];
}
}
while (count > 0) {
arr[len - count] = x;
count--;
}
console.log(arr);
}
putBack([1, 7, 0, 2, 7, 0, 4, 5], 7);
//[ 1, 0, 2, 0, 4, 5, 7, 7 ]
做法二:
//根据这个思想,写了下面这个代码,假设指定数字是X
function backShift(arr, x) {
var len = arr.length;
//i指向没有访问过的位置,j指向x区域的开始位置
var index = arr.indexOf(x);
var [i, j] = [index + 1, index];
while (i < len) {
if (arr[i] !== x) {
arr[j] = arr[i];
i++;
j++;
} else {
i++;
}
}
//把最后j指向位置一直到数组最后写成x
while (j < len) {
arr[j++] = x;
}
console.log(arr);
}
backShift([1, 7, 0, 2, 7, 0, 4, 5], 7);
然而、大佬的代码是这样的:
//第二种思想的第二种写法
function backShift2(arr, x) {
var len = arr.length;
//i指向没有访问过的位置,j指向x区域的开始位置
var j = 0;
for (var i = 0; i < len; i++) {
//不同时交换数据并j++、i++,相同时i++
if (arr[i] !== x) {
[arr[i], arr[j]] = [arr[j], arr[i]];
j++;
}
}
while (j < len) {
arr[j++] = x;
}
console.log(arr);
}
backShift2([1, 7, 0, 2, 7, 0, 4, 5], 7);
快速排序
/*
快速排序:小于基准k的放左边,大于k的放右边
这样跟上面的思想是一样的。然后用上面这种方式做,稍微改一下
第一段:小于x的;
第二段:大于X的;
第三段: 没有访问的;
*/
function partition(arr, L, R) {
//利用最后一个值作为key
var key = arr[R];
//i指向没有访问过的位置,j指向x区域的开始位置
var j = L;
for (var i = L; i < R; i++) {
//小于精准值的放到第一段,大于等于的放第二段
if (arr[i] < key) {
[arr[i], arr[j]] = [arr[j], arr[i]];
j++;
}
}
//把键值放到j的位置
[arr[R], arr[j]] = [arr[j], arr[R]];
return j;
}
function QuickSort(arr, L, R, str) {
if (L < R) {
var mid = partition(arr, L, R);
QuickSort(arr, L, mid - 1); //左边部分接着排
QuickSort(arr, mid + 1, R); //右边部分接着排
}
}
var arr = [7, 3, 5, 2, 1, 8];
QuickSort(arr, 0, 5);
console.log(arr);