基本算法:
1.冒泡排序:
1.原理:比较两个相邻的元素,将值大的元素交换到右边
2.思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。
(1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。
(2)比较第2和第3个数,将小数 放在前面,大数放在后面。
......
(3)如此继续,直到比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成
(4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。
(5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。
(6)依次类推,每一趟比较次数减少依次
1 function bubbleSort(arr) { 2 var len = arr.length; 3 for (var i = 0; i < len - 1; i++) {//外层控制循环多少趟, 4 for (var j = 0; j < len - 1 - i; j++) {//内层控制每一趟的循环次数 5 if (arr[j] > arr[j+1]) { // 相邻元素两两对比 6 var temp = arr[j+1]; // 元素交换 7 arr[j+1] = arr[j]; 8 arr[j] = temp; 9 } 10 } 11 } 12 return arr; 13 }
2.快速排序:
1.算法思想
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
2.实现原理
(1)设置两个变量 low、high,排序开始时:low=0,high=size-1。
(2)整个数组找基准正确位置,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面
(3)默认数组的第一个数为基准数据,赋值给key,即key=array[low]。
(4)因为默认数组的第一个数为基准,所以从后面开始向前搜索(high–),找到第一个小于key的array[high],就将 array[high] 赋给 array[low],即 array[low] = array[high]。(循环条件是 array[high] >= key;结束时 array[high] < key)
(5)此时从前面开始向后搜索(low++),找到第一个大于key的array[low],就将 array[low] 赋给 array[high],即 array[high] = array[low]。(循环条件是 array[low] <= key;结束时 array[low] > key)
(6)循环 4-5步骤,直到 low=high,该位置就是基准位置。
(7)把基准数据赋给当前位置。
1 function swap(items, firstIndex, secondIndex){ 2 var temp = items[firstIndex]; 3 items[firstIndex] = items[secondIndex]; 4 items[secondIndex] = temp; 5 } 6 7 function partition(items, left, right) { 8 var pivot = items[Math.floor((right + left) / 2)], 9 i = left, 10 j = right; 11 while (i <= j) { 12 while (items[i] < pivot) { 13 i++; 14 } 15 while (items[j] > pivot) { 16 j--; 17 } 18 if (i <= j) { 19 swap(items, i, j); 20 i++; 21 j--; 22 } 23 } 24 return i; 25 } 26 27 function quickSort(items, left, right) { 28 var index; 29 if (items.length > 1) { 30 index = partition(items, left, right); 31 if (left < index - 1) { 32 quickSort(items, left, index - 1); 33 } 34 if (index < right) { 35 quickSort(items, index, right); 36 } 37 } 38 return items; 39 } 40 41 var items = [3,8,7,2,9,4,10] 42 var result = quickSort(items, 0, items.length - 1);
3.插入排序
1.原理
将一组数据分成俩组,暂时叫做有序组和待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。当然,插入过程中涉及到了元素的移动。
2.过程
(1)将数组的第一个数作为有序组,其他数作为待插入组
(2)从待插入组依次与有序组中的数进行对比,在合适位置插入
(3)直到待插入组为空
1 function insertionSort(arr) { 2 var len = arr.length; 3 var preIndex, current; 4 for (var i = 1; i < len; i++) {//从1开始,数组从第二个数开始作为待插入组 5 preIndex = i - 1; 6 current = arr[i]; 7 while(preIndex >= 0 && arr[preIndex] > current) { 8 arr[preIndex+1] = arr[preIndex]; 9 preIndex--; 10 } 11 arr[preIndex+1] = current; 12 } 13 return arr; 14 }
4.选择排序
1.原理
选择排序改进了冒泡排序,每次遍历列表只做一次交换,为了做到这一点,一个选择排序在遍历时寻找最大(小)的值,并在完成遍历后,将其放到正确的地方。
2.过程
(1)第一轮从arr[0]~arr[n-1]中找到最小的元素,与arr[0]进行交换;
(2)第二轮从arr[1]~arr[n-1]中找到最小的元素,与arr[1]进行交换;
…
(3)依次类推,经过n-1轮之后,就形成了有序序列
function selectionSort(arr) { var len = arr.length; var minIndex, temp; for (var i = 0; i < len - 1; i++) { minIndex = i; for (var j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { // 寻找最小的数 minIndex = j; // 将最小数的索引保存 } } temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } return arr; }
5.时间复杂度空间复杂度对比
在冒泡排序,插入排序,选择排序,快速排序中,在最最坏情况下,快速排序的时间复杂为O(n2) ,插入排序O(n2),选择排序O(n2),冒泡排序O(n2)