logo头像

流莹离|拼命往前,仗剑天涯

排序算法

八大算法

  • 快速排序
  • 冒泡排序
  • 插入排序
  • 堆排序
  • 希尔排序
  • 归并排序
  • 简单选择排序
  • 交换排序

快速排序

原理:选择一个基准元素,将比基准元素小的元素放在其前面,比基准元素大的元素放在其后面,然后在将小于基准值元素的子数列和大于基准元素的子数列按原来的方法排序,直到整个序列有序;

时间复杂度:O(NlogN)   

稳定性:不稳定

冒泡排序

原理:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现他们的排序与排序要求相反时,就将他们互换。

时间复杂度:O(N*N)  

稳定性:稳定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function bubbleSort(arr){
let temp;
for(let i = 0;i<arr.length - 1;i++){
for(let j = 0;j<arr.length - 1 - i;j++){
if(arr[j] > arr[j+1]){
temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
}
}
}
return arr
}
function bubbleSort(arr){
let temp,j;
let len = arr.length
while(len > 0){
for(j = 0;j<len - 1;j++){
if(arr[j] > arr[j+1]){
temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
}
}
i--;
}
return arr
}

插入排序

原理:将一个记录插入到已排序好的有序表中,从而得到一个新的,记录数增1的有序表。即先将序列的第一个记录看成是一个有序的子序列,然后从第二个记录逐个进行插入,直至整个序列有序为止。

堆排序

原理:

希尔排序

原理:

归并排序

原理:

堆排序

原理:

选择排序

原理:

第一趟:从第一个记录开始,将后面n-1个记录进行比较,找到其中最小的记录和第一个记录进行交换;

第二趟:从第二个记录开始,将后面n-2个记录进行比较,找到其中最小的记录和第2个记录进行交换;

………..

第i趟:从第i个记录开始,将后面n-i个记录进行比较,找到其中最小的记录和第i个记录进行交换;

以此类推,经过n-1趟比较,将n-1个记录排到位,剩下一个最大记录直接排在最后;

时间复杂度:O(N*N)   

稳定性:不稳定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function selectSort(arr){
let temp;
for(let i = 0;i<arr.length;i++){
let minIndex = i;
for(let j = i;j<arr.length;j++){
if(arr[j] < arr[minIndex]){
minIndex = j
}
}
if(minIndex !== i){
temp = arr[i];
arr[i] = arr[minIndex]
arr[minIndex] = temp
}
}
return arr
}

交换排序

原理: