想自己总结一下八大排序算法,以下全部按照从小到大排吧。后续想到什么再补充
1. 直接插入排序
看成一个无序表向有序表中插入元素,实际上仅用一表就可完成。设置哨兵,从小到大排列,可以每次把有序表中最后一个数作为哨兵。如果≥哨兵值,直接插入到后边,改哨兵为现在有序表中最后一个(也就是新插入的值)。如果<哨兵,和哨兵前面的元素比较大小,且一个一个后移,直到遇到比自己小的数或到达[0],此时停止并插入。
不知道这样子说够不够详细,原谅弱鸡吧。我是给自己复习看的。。。
#include<iostream>
using namespace std;
void insert(int a[],int n){
for(int i=1;i<n;i++){
if(a[i-1]>a[i]){ //移
int k=a[i];//哨兵
int j=i-1;
for(j;j>=0;j--){
if(a[j]>k){
a[j+1]=a[j];
if(j==0){ //记得==0的情况
a[0]=k;
}
}
else{
a[j+1]=k; //注意插入位置
break;
}
}
}
}
}
int main(){
int n;
int a[100];
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
insert(a,n);
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
}
O(n^2)
2. 希尔排序
非稳定排序算法,也叫缩小增量排序。按增量顺序抓取子序列进行排序,并递减增量,直到增量为1,此时排序完成。需要注意:增量因子中除1 外没有公因子,且最后一个增量因子必须为1。希尔排序方法是一个不稳定的排序方法。 一般我会取数列length的一半做开始,时间复杂度难分析。
(ps 男票面试字节跳动就被问到希尔排序了,结果答成归并排序了,操作很骚)
#include<iostream>
using namespace std;
void insert(int a[],int n,int dk){
for(int i=dk;i<n;i++){
if(a[i-dk]>a[i]){
int j=i-dk;
int k=a[i]; //跟直接插入一样,哨兵
a[i]=a[i-dk];
while(k<a[j]){ //往自己的子序列前方寻找比自己小的数,插入
a[j+dk]=a[j]; //比k大,后移
j-=dk;
if(j<0){
break; //注意!
}
}
a[j+dk]=k;//找到后插入
}
}
}
void shell_sort(int a[],int n){
int dk=n/2;
while(dk>=1){
insert(a,n,dk);
dk/=2;
}
}
int main(){
int n;
int a[100];
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
shell_sort(a,n);
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
}
//49 38 65 97 76 13 27 49 56 4