@Bios
2018-12-10T08:45:53.000000Z
字数 2271
阅读 1663
js 算法
原理:从第一个元素开始,往后比较,遇到自己小的元素就交换位置
代码实现:
// 冒泡算法function bubbleSort(arr) {var len = arr.length;for (var i = 0; i < len; i++) {for (var j = 0; j < len-1-i; j++) {// 为什么要减一,数组从0开始,先取第一个与第二个比,再将较大值与第三个比,一直比到最后一个,再拿第二个值与第三个比……(外层循环一次,内层循环多次)if (arr[j] > arr[j+1]) { // 比较相邻两个值的大小var temp = arr[j+1]; // 临时变量存储arr[j+1]的值arr[j+1] = arr[j]; // 将arr[j]的值赋值给arr[j+1],即把较大值往后放arr[j] = temp; // 又将temp的值赋值给arr[j],即将较小值往前放}}}return arr;}var arr = [2, 3, 4, 5, 6, 1, 90, 16, 35, 7];console.log(bubbleSort(arr)); // [1, 2, 3, 4, 5, 6, 7, 16, 35, 90]
Gif图:
特点:
插入排序把要排序的数组分成两部分:
第一部分包含了这个数组的所有元素,但将第一个元素除外(让数组多一个空间才有插入的位置)。
第二部分就是包含了这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分
比冒泡排序快一点
代码实现:
// 插入排序function insertSort(arr) {// 从第二个元素开始,因为要留一个坑for (var i = 1; i < arr.length; i++) {var x = arr[i]; // 现将arr[i]的值存下来for (var j = i-1; arr[j] > x; j--) {arr[j+1] = arr[j]; // i=3时 [2, 3, 6, 6, ...]}if (arr[j+1] != x) {arr[j+1] = x; // i=3时 j=2 [2, 3, 4, 6, ...]}}return arr;}var arr = [2, 3, 6, 4, 2, 1, 90, 100, 20, 5];console.log(insertSort(arr)); //[1, 2, 2, 3, 4, 5, 6, 20, 90, 100]
代码实现:
// 希尔排序function shellSort(arr) {var gap = Math.floor(arr.length / 2);while (gap > 0) {for (var i = gap; i < arr.length; i++) {temp = arr[i];for (var j = i; j >= gap && arr[j-gap] > temp; j -= gap) {arr[j] = arr[j - gap];}arr[j] = temp;}gap = Math.floor(gap / 2);}return arr;}var arr = [2, 3, 6, 4, 2, 1, 90, 100, 20, 5];console.log(shellSort(arr)); //[1, 2, 2, 3, 4, 5, 6, 20, 90, 100]
3、对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
特点:速度最快。和归并排序不同的是,归并排序是先分为两组再继续排,而快速排序是边分边排
代码实现:
// 大致分三步:// 1、找基准(一般以中间项为基准)// 2、遍历数组,小于基准的放在left,大于基准的放在right// 3、递归function quickSort(arr) {// 如果数组<=1,则直接返回if (arr.length <= 1) {return arr;}var pivotIndex = Math.floor(arr.length / 2);// 找基准,并把基准从原数组删除var pivot = arr.splice(pivotIndex, 1)[0];// 定义左右数组var left = [];var right = [];// 比基准小的放在left,比基准大的放在rightfor (var i = 0; i < arr.length; i++) {if(arr[i] <= pivot) {left.push(arr[i]);} else {right.push(arr[i]);}}// 递归return quickSort(left).concat([pivot], quickSort(right));}var arr = [2, 3, 6, 4, 2, 1, 90, 100, 20, 5];console.log(quickSort(arr)); //[1, 2, 2, 3, 4, 5, 6, 20, 90, 100]
代码实现:
//奇偶排序function oddEvenSort(arr) {// swaped用来控制循环是否要继续,如果左边的都比右边的小,则退出循环,返回排好的数组var swaped = true;var k = 0;while(swaped) {if(k > 0) {swaped = false;}for (var i = k;i < arr.length-1; i += 2) {if(arr[i] > arr[i+1]) {// 如果左边的数字比右边的大,两边交换位置arr[i] = [arr[i+1], arr[i+1] = arr[i]][0];swaped = true;}}k = [1, 0][k]; // 奇偶数之间的转换}return arr;}var arr = [2, 3, 6, 4, 2, 1, 90, 100, 20, 5];console.log(oddEvenSort(arr)); // [1, 2, 3, 4, 5, 6, 20, 90, 100]