1.快排
//新建数组递归,理解容易,性能差,不算真正意义上的快排
function quicksort(arr) {
if(arr.length<=1) return arr;
let left=[];
let right=[];
let num=arr[0];
for(let i=1;i<arr.length;i++) {
if(arr[i]>num) right.push(arr[i]);
else left.push(arr[i])
}
return quicksort(left).concat(num,quicksort(right));
}
//标准版本
function partition(arr,low,high){
let pivot=arr[low];
while(low<high){
while(low<high && arr[high]>=pivot){
high--;
}
arr[low]=arr[high];
while(low<high && arr[low]<=pivot){
low++;
}
arr[high]=arr[low];
}
arr[low]=pivot;
return low;
}
function quickSort(arr,low,high){
if(low<high){
let pivotPos=partition(arr,low,high);
quickSort(arr,low,pivotPos-1);
quickSort(arr,pivotPos+1,high);
}
}
2.冒泡
function bubblesort(arr) {
for(let i =0;i<arr.length;i++) {
for(let j=i;j<arr.length;j++) {
if(arr[i]>arr[j]){
let temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
3.选择排序
通过比较首先选出最小的一个数放在第一个位置,然后在其余的数中选出次小的数放在第二个位置,以此类推直到所有的数成为有序的序列
function selectsort(arr) {
for(let i=0;i<arr.length;i++) {
let min=i;
for(let j=i;j<arr.length;j++){
if(arr[min]>arr[j]){
min=j;
}
}
let temp=arr[i];
arr[i]=arr[min];
arr[min]=temp;
}
}
4.插入排序
从第二个元素开始,将待排元素插入到前面已经排好序的序列中
function insersort(arr){
for(let i=1;i<arr.length;i++){
for(let j=i;j>0;j--){
if(arr[j-1]>arr[j]){
let temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}
}
}
return arr;
}
在基数特别大的情况,且有上下限适用于基数排序和桶排序
5.基数排序
一个列表,列表按照顺序排列,每个列表项是一个链表。遍历数据,数据是多大就放在哪个列表项中,插入列表项的链表末尾,这样遍历完所有的数据,就得到了一个顺序的列表,列表每一项都是一样大数据的链表。
时间复杂度O(n)
6.桶排序(适用于数据分布比较均匀的情况)
类似于基数排序,如果每个桶都只能放一个数据,那就等于基数排序,如果每个桶能放一个区间的数据,就是桶排序。
每个桶都有个区间范围,别设置的太大。
桶和桶之间是顺序排放的,遍历数据,在哪个桶的范围内就放哪个桶里,最后再对每个桶进行排序。
桶排序的时间复杂度一般为 O(n + k),其中 n 是待排序元素的个数,k 是桶的数量。对于桶内排序,如果选择了高效的排序算法(如插入排序),时间复杂度接近 O(n),但实际性能还取决于数据分布和桶的数量。