这里是来自数据结构排序的笔记
主要是总结一下各种课本er上的排序(自己敲一遍代码而已qwq)
真的用起来,那当然还是sort大法好!
1.冒泡排序(BubbleSort) [O (n^2)]
查找每个元素,如果后面的有比他小的,就让他到前面来;就像小泡泡往上面冒一样。
很漂亮的代码,简洁好看,只是复杂度8行啊…
void bubblesort(int a[],int l){
for(int i=0;i<l;i++){
for(int j=i;j<l;j++){
if(a[i]>a[j]){
swap(a[i],a[j]);
}
}
}
return ;
}
2.插入排序(InsertionSort) [O(n^2)]
是在假设前面一部分已经排好序的前提下,不断地放大问题范围来解决的方案
寻找排好序的表后第一个元素(也就是第一个没排好的元素),往前查看,寻找使它插入的合适位置。
//find the ele in front of it which is smaller
void insertionsort(int a[],int l){
for(int i=0;i<l;i++){
//倒序昂
for(int j=i;j>=0&&a[j]<a[j-1];j--){
swap(a[j],a[j-1]);
}
}
}
3.插入排序优化-希尔排序
//Shellsort
void ShellSort1(int a[],int n){
int gap=n;
while(gap>1){
gap/=3;
gap++;
int id=gap;
while(id<=n){
int tmp=a[id];
int end=id-gap;
while(end>=0&&tmp<a[end]){
a[end+gap]=a[end];
end-=gap;
}
a[end+gap]=tmp;
id+=gap;
}
}
}
另一版本
void ShellSort2(int a[],int n){
for(int gap=n/2;gap>2;gap/=2){
for(int j=0;j<gap;j++){
for(int k=gap;k<=n-j;k+=gap){
for(int o=k;o>=gap&&a[o]<a[o-gap];o-=gap){
swap(a[o],a[o-gap]);
}
}
}
}
//InsertionSort(a,12)
for(int k=1;k<=n;k++){
for(int o=k;o>=1&&a[o]<a[o-1];o--){
swap(a[o],a[o-1]);
}
}
}
4.归并
void Merge(int a[],int l,int mid,int r){
int tmp[r-l+1];
int i=0,idl=l,idr=mid+1;
while(idl<=mid&&idr<=r){
tmp[i++]=a[idl]<=a[idr]?a[idl++]:a[idr++];
}
while(idl<=mid)tmp[i++]=a[idl++];
while(idr<=r) tmp[i++]=a[idr++];
for(int k=0;k<=r-l;k++)a[k+l]=tmp[k];
}
void Merge2(int a[],int l,int mid, int r){
int L[3000],R[3000],cnt1=0,cnt2=0,cnt=l-1;
for(int i=l;i<=mid;i++)
L[++cnt1]=a[i];
for(int i=mid+1;i<=r;i++)
R[++cnt2]=a[i];
int i=1,j=1;
while(i<=cnt1&&j<=cnt2){
if(L[i]<R[j])
a[++cnt]=L[i++];
else
a[++cnt]=R[j++];
}
while(i<=cnt1) a[++cnt]=L[i++];
while(j<=cnt2) a[++cnt]=R[j++];
return;
}
void MergeSort(int a[],int l,int r){
if(l<r){
int mid=(l+r)>>1;
MergeSort(a,l,mid);
MergeSort(a,mid+1,r);
Merge(a,l,mid,r);
}
}
5.快排
void QuickSort(int a[],int l,int r){
if(l>r)return;
int base=a[l];
int i=l,j=r;
while(i!=j){
while(a[l]<=a[j]&&i<j)j--;
a[i]=a[j];
while(a[l]>=a[i]&&i<j)i++;
a[j]=a[i];
}
a[i]=base;
QuickSort(a,l,i-1);
QuickSort(a,j+1,r);
}
6.堆排序
//Heapsort
void siftdown(int a[],int x,int n){
int pos=x;
while(pos*2<n){
int j=pos*2;
if(j+1<n&&a[j+1]>a[j]) j++;
if(a[pos]>a[j]) return ;
swap(a[pos],a[j]);
pos=j;
}
}
void HeapSort(int a[],int n){
int tmp[500],cnt=0;
for(int i=n/2;i>=1;i--){
siftdown(a,i,n);
}
tmp[++cnt]=a[1];
for(int i=n;i>=2;i--){
swap(a[1],a[i]);
siftdown(a,1,i-1);
tmp[++cnt]=a[1];
}
for(int i=1;i<=n;i++){
a[i]=tmp[n-i+1];
}
}
7.基数排序
//Radix Sort
struct P{
int id[5000];
int l;
}bin[15];
void ini(int base){
for(int i=0;i<base;i++){
bin[i].l=0;
}
}
void getrank(int a[],int n,int id,int base){
for(int i=1;i<=n;i++){
int b=pow(base,id-1);
int ll=(a[i]/b)%base;
bin[ll].id[++bin[ll].l]=i;
}
}
void process(int a[],int n,int base){
int tmp[5000];
int cnt=0;
for(int i=0;i<base;i++){
if(bin[i].l){
for(int j=1;j<=bin[i].l;j++){
tmp[++cnt]=a[bin[i].id[j]];
}
}
}
for(int i=1;i<=n;i++)
a[i]=tmp[i];
}
void RadixSort(int a[],int n,int k,int base){
int bin[base];
for(int i=1;i<=k;i++){
ini(base);
getrank(a,n,i,base);
process(a,n,base);
}
}