目录
在数据结构与算法中,有十种排序算法,分别是冒泡排序、插入排序、选择排序、快速排序、希尔排序、堆排序、归并排序、计数排序、桶排序和基数排序。比较常用的是冒泡排序、插入排序、选择排序、快速排序、希尔排序。
1、冒泡排序
冒泡排序的思路是从数组的第一个元素开始与相邻的元素进行比较大小,如果更大则交换两者的位置,更大的将继续与后面的元素进行比较,直至比到最后一个元素,比完一轮则可以得出最后一个为最大数,第二轮也从第一个元素开始从前往后比,得出数组倒数第二个值为第二大的值。以此类推。
图示如下:
代码如下:
//冒泡排序
var arr = [56, 2, 4, 7, 23, 5, 3]
for (var i = 0; i < arr.length - 1; i++) {
for (var j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) { //比较相邻的两个数 后面的数更大的则交换它们的位置
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp
}
}
}
console.log(arr);
2、插入排序
插入排序的基本思路是先插入一个数,认为是有序的,然后再继续插入下一个数,与前面有序的数进行逐一比较,插入到有序的位置中,以此类推,每次插入的数都要从前面比较大小然后找到合适的位置插入。
图示如下:
代码如下:
//插入排序
let arr = [2, 3, 1, 4, 8, 7, 9, 6];
let temp
for (var i = 0; i < arr.length; i++) {
temp = arr[i];
for (var j = i; j >= 0; j--) {
if (arr[j - 1] > temp) { //将插入的数与前面有序的数进行对比
arr[j] = arr[j - 1] //如果插入的数小于前面有序数就交换位置
} else {
arr[j] = temp //比较完了就把插入的数放入位置
break
}
}
}
console.log(arr)
3、选择排序
选择排序的基本思路是从一个数组中选择一个最小值放在排序列表的起始位置,再选择剩下的最小值放在已排序的队尾,继续以此类推,直至所有排序完成。也可以选择最大值放在末尾,继而选出其他最大值依次放入。
图例如下:
代码如下:
//选择排序
var temp, minIndex;
let arr = [4, 2, 3, 8, 7, 1, 9, 6];
for (var i = 0; i < arr.length - 1; i++) {
minIndex = i //定义最小值下标
for (var j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) { //如果当前数小于定义的最小值
minIndex = j //则把下标定义为当前值的下标
}
}
temp = arr[i]; //一轮循环完毕则把正在比较的值与下标为最小值的值交换位置
arr[i] = arr[minIndex];
arr[minIndex] = temp
}
console.log(arr)
4、快速排序
快速排序的基本思路为选择一个参考元素,将数组分割为两个子序列,对序列重新排序,将所有小于基准的元素放在基准值的前面,大于基准值的元素放在基准值的右侧,快速排序是对冒泡排序的一种优化。
图例如下:
代码如下:
//快速排序
function sort (arr, begin, end) {
if (begin < end) {
let i = begin;
let j = end;
let empty = arr[begin];
while (i < j) {
while (arr[j] > empty && i < j) {
j--;
}
arr[i] = arr[j];
while (arr[i] < empty && i < j) {
i++;
}
arr[j] = arr[i];
}
arr[i] = empty;
sort(arr, begin, i - 1);
sort(arr, i + 1, end);
} else {
return;
}
}
let arr = [2, 3, 1, 4, 8, 7, 9, 6];
sort(arr, 0, 7);
console.log(arr);
5、希尔排序
希尔排序的基本思路为把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。
图示如下:
代码如下:
//希尔排序
let arr = [4, 2, 3, 8, 7, 1, 9, 6];
let len = arr.length;
for (var gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
//将数组依次分为几个小块进行比较
for (var i = gap; i < len; i++) {
var j = i;
var current = arr[i];
while (j - gap >= 0 && current < arr[j - gap]) {
arr[j] = arr[j - gap];
j = j - gap;
}
arr[j] = current;
}
}
console.log(arr)
基本常用的就是这些排序算法,其中时间复杂度为O(n^2)的是冒泡排序,插入排序,选择排序,时间复杂度为O(nlogn)的是快速排序和希尔排序。其中不稳定的是选择排序,快速排序,希尔排序