1、冒泡排序
-
第一个元素与后面的每个元素单独比较,小则交换,如此得到最大值,在从第二个元素开始继续如此操作
-
代码演示
function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len - 1; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j+1]) { // 相邻元素两两对比 var temp = arr[j+1]; // 元素交换 arr[j+1] = arr[j]; arr[j] = temp; } } } return arr; }
2、选择排序
-
查找一遍数组,找到最小的元素,与第一个元素交换位置;从第二个数组再继续如此操作
-
代码演示
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; }
3、插入排序(步长为1的希尔排序)
-
从第二个元素开始,与前面一个元素比较,比前面元素小就插入到前面元素的前面(或者与前面第二个元素比较),比前面元素大就插入到前面元素的后面,如此循环
-
代码演示
public static int[] selectionSort(int[] arr) { for (int i =1; i < arr.length; i++) { for (int j =i; j >0; j--) { if(arr[j]>arr[j-1]){ int a=arr[j]; arr[j]=arr[j-1]; arr[j-1]=a; } } } return arr; }
4、希尔排序:对插入排序的优化
-
选定数组总长度的一半作为步长,进行两两比较排序,再取一半的一半,知道步长为1,得出结果
-
代码演示
public static int[] select2(int[] arr) { for (int k =arr.length/2;k>0; k/=2) for (int i =k; i < arr.length; i++) { for (int j =i; j >k-1; j--) { if(arr[j]>arr[j-k]){ int a=arr[j]; arr[j]=arr[j-k]; arr[j-k]=a; } } } return arr; }
5、快速排序
- 从数列中挑出一个元素作为 基准,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面,如此循环
6、归并序列
- 分而治之,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
7、基数排序
- 取最大数,确定位数,在按位数分组,从而进行计数排序
8、堆排序
- 利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
9、二分查找法
-
代码演示
public static int binarySearch(int[] array, int target) { //前提:array必须有序 int left = 0; int right = array.length - 1; while (left <= right) { int mid = left + (right - left) / 2; if (array[mid] == target) { return mid; // 目标值在数组中的索引 } else if (array[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; // 未找到目标值 }