相关术语:
稳定:在原序列中,a与b相等,且a在b前面。如果排序后a仍在b前面,则称此排序算法为稳定
不稳定:在原序列中,a与b相等,且a在b前面。如果排序后a可能出现在b的后面,则称此排序算法为不稳定
时间复杂度:完成该算法所需(消耗)的时间
空间复杂度:一个算法在运行过程中所占用的内存大小
内排序:被排序的数据元素全部存放在计算机内存中的排序算法,即所有排序操作都在内存中完成
外排序:由于数据过大,内存中不能一次装入全部数据,所以需要将待排序数据放在磁盘中,排序需要在内存和外部存储器之间进行多次数据传输才能进行。
1. 冒泡排序
思想:比较相邻的两个元素,如果前一个比后一个大就交换位置,第一轮下来,最后一个元素是最大的,以此类推。
function bubbleSort(arr){
let len = arr.length;
for(let i = arr.length-1;i>0;i--)
for(let j = 0;j<i;j++){
if(arr[j]>arr[j+1]){
let temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
return arr;
}
2. 快速排序
思想:先从数组中找一个基准数,然后分区,比这个数大的放在左边,小于或等于的放在右边,而后再对左右两边重复大的放在左边,小于或等于的放在右边,直至各区间仅剩一个数。
function quickSort(arr,l,r){
if(arr.length<=1){
return arr;
}
if(l<r){
let i = l,j = r;
let x = arr[i];//基准数
while(i<j){
//从右向左找小于等于x的数
while(i<j && arr[j] >= x) j--;
if(i<j){ arr[i] = arr[j]; i++;}
//从左向右找大于x的数
while(i<j && arr[i] < x) i++;
if(i<j){ arr[j] = arr[i]; j--;}
}
arr[i] = x;
quickSort(arr,l,i-1);
quickSort(arr,i+1,r);
return arr;
}
}
3. 插入排序
思想:从第一个元素开始,认为该元素已经是排序好的。将无序序列中的数据插入到有序的序列中,在遍历无序序列时,首先拿无序序列中的首元素去与有序序列中的每一个元素比较并插入到合适的位置,一直到无序序列中的所有元素插完为止。
function insertSort(arr){
//从第一个元素遍历无序数组
let len = arr.length;
let i,j,temp; //j为有序序列的最后一个元素的索引
for(i = 1;i<len;i++){
temp = arr[i]; //temp为无序序列的第一个元素
for(j = i-1;j>=0 && arr[j]>temp;j--){
arr[j+1] = arr[j]; //向后移空出位置
}
arr[j+1] = temp;
}
return arr;
}
4. 选择排序
思想:顾名思义,遍历数组,每次选择最小的元素放在前面。首先,找到数组中最小的元素,将它和数组的第一个元素交换位置,然后,在剩下的元素中继续寻找最小的元素和数组的第二个元素交换位置,如此循环,直到整个数组排序完成。
function selectSort(arr){
let len = arr.length;
for(let i = 0;i<len;i++){
let index = i;
for(let j = i+1;j<len;j++){//找出最小元素的下标 index
if(arr[index] > arr[j])
index = j;
}
//交换
let temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
}
return arr;
}
5. 希尔排序
思想:希尔排序适合较大规模的无序数据。先将整个待排序的数据分割为若干组,然后对每一个分组分别进行插入排序。排序完后的分组大体小元素在前,大元素在后,然后缩小增量,继续分组,此时虽然每个分组元素个数变多了,但是数组变有序了,效率也是比较高的。
6. 堆排序
思想:堆排序利用堆的数据结果设计的排序算法。堆是一个近似完全二叉树的结构,同时满足:子节点的键值或索引总是小于/大于父节点。
= _ = ,找到了一个图文说明