DataStructure_Sorting

这里是来自数据结构排序的笔记
主要是总结一下各种课本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);
 }
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值