快排:这里的形参为最大索引(面试一定会问)
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; typedef long long ll; #define maxn 10000 int arr[maxn]={3,5,7,4,1}; void quicksort(int a[],int l,int r){ int i=l,j=r,tmp=a[l]; if(l>=r) return; while(i!=j){ while(j>i&&a[j]>tmp) j--; if(j>i) a[i]=a[j]; while(i<j&&a[i]<tmp) i++; if(i<j) a[j]=a[i]; } a[i]=tmp; quicksort(a,l,i-1); quicksort(a,i+1,r); } int main(){ quicksort(arr,0,4); for(int i=0;i<5;i++){ printf("%d ",arr[i]); } printf(" "); return 0; }
归并:这里的形参为最大索引
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> #define maxn 10000 using namespace std; typedef long long ll; int tmp[maxn],a[maxn]; void merge(int l,int m,int r){ int i=l,j=m+1,k=0; while(i<=m&&j<=r){ if(a[i]<a[j]) tmp[k++]=a[i++]; else tmp[k++]=a[j++]; } while(i<=m) tmp[k++]=a[i++]; while(j<=r) tmp[k++]=a[j++]; for(int i=l;i<=r;i++) a[i]=tmp[i-l]; } void mergesort(int l,int r){ if(l<r){ int mid=(l+r)>>1; mergesort(l,mid); mergesort(mid+1,r); merge(l,mid,r); } } int main(){ int n; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; mergesort(0,n-1); for(int i=0;i<n;i++){ printf("%d ",a[i]); } return 0; }
堆排:这里的形参为size
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath> #include<iostream> using namespace std; typedef long long ll; void adjustheap(int heap[],int i,int size){ int j=2*i+1; while(j<size){ if(j<size-1&&heap[j]<heap[j+1]) swap(heap[j],heap[j+1]); if(heap[i]>heap[j])break; swap(heap[i],heap[j]); i=j; j=2*i+1; } } void heapsort(int heap[],int size){ for(int i=size/2-1;i>=0;i--){ adjustheap(heap,i,size); } for(int i=size-1;i>0;i--){ swap(heap[0],heap[i]); adjustheap(heap,0,i); } } int main(){ int a[10]={1,5,3,4,2}; heapsort(a,5); for(int i=0;i<5;i++){ printf("%d ",a[i]); } return 0; }
插入、选择、冒泡:
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> #define maxn 10000 using namespace std; typedef long long ll; int arr[maxn]={1,3,2,5,4},n=5; //插入、选择、冒泡、 堆排、快排、归并、希尔 void bubble_sort(){ for(int i=0;i<n-1;i++){ for(int j=0;j<n-1-i;j++){ if(arr[j]>arr[j+1])swap(arr[j+1],arr[j]); } } } void select_sort(){ for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(arr[j]<arr[i]) swap(arr[i],arr[j]); } } } void insert_sort(){ for(int i=1;i<n;i++){ for(int j=0;j<i;j++){ if(arr[i]<arr[j]) swap(arr[i],arr[j]); } } } int main(){ //bubble_sort(); //select_sort(); insert_sort(); for(int i=0;i<n;i++){ printf("%d ",arr[i]); } printf(" "); return 0; }
希尔排序:
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; typedef long long ll; int arr[10] = {9,1,5,8,3,7,6,0,2,4}; void shellsort(int a[],int len){ for(int gap=len/2;gap>0;gap/=2){ for(int i=gap;i<len;i++){ int j=i; while(j-gap>=0&&a[j]<a[j-gap]) swap(a[j],a[j-gap]),j-=gap; } } } int main(){ shellsort(arr,10); for(int i=0;i<10;i++){ printf("%d ",arr[i]); } printf(" "); return 0; }
基数排序:
#include<cstdio> #include<cstdlib> #include<iostream> #include<cmath> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; int a[]={5,2,3,1,4}; void tmpsort(int a[],int n,int exp){ int cnt[10]={0},output[n]; for(int i=0;i<n;i++) cnt[a[i]/exp%10]++; for(int i=1;i<10;i++) cnt[i]+=cnt[i-1]; for(int i=n-1;i>=0;i--) output[cnt[a[i]/exp%10]-1]=a[i],cnt[a[i]/exp%10]--; for(int i=0;i<n;i++) a[i]=output[i]; } void radixsort(int a[],int n){ int maxx=-inf; for(int i=0;i<n;i++) maxx=max(maxx,a[i]); for(int i=1;maxx/i>0;i*=10) tmpsort(a,n,i); } int main(){ radixsort(a,5); for(int i=0;i<5;i++){ printf("%d ",a[i]); } return 0; }