DS -排序算法复习

it2024-05-11  48

冒泡排序 快速排序 直接插入排序 二分插入排序 希尔排序 选择排序 堆排序 归并排序

#include <iostream> #include<cstdlib> using namespace std; const int N=6; int n=5; int arr[N]={0,5,2,6,9,4}; void p(){ for(int i=1;i<=n;i++){ cout<<arr[i]<<" "; } cout<<endl; } void merge_sort(int l, int r){ int *t=(int *)malloc((r+1)*sizeof(int)); for(int i=l;i<=r;i++){ t[i]=arr[i]; } int m=(l+r)/2; int i=l,j=m+1,k=l; for(;i<=m && j<=r;k++){ if(t[i]<t[j]){ arr[k]=t[i++]; }else{ arr[k]=t[j++]; } } while(i<=m){ arr[k++]=t[i++]; } while(j<=r){ arr[k++]=t[j++]; } } void merge(int l, int r){ if(l<r){ int m=(l+r)/2; merge(l,m); merge(m+1,r); merge_sort(l,r); } } int pivot(int l, int r){ int p=l; arr[0]=arr[l]; while(l<r){ while(l<r && arr[r]>arr[0]){ r--; } arr[l]=arr[r]; while(l<r && arr[l]<arr[0]){ l++; } arr[r]=arr[l]; } arr[l]=arr[0]; return l; } void my_q_sort(int l, int r){ if(l<r){ int p=pivot(l,r); my_q_sort(l,p-1); my_q_sort(p+1,r); } } void my_adjust_heap(int index, int len){ int key=arr[index]; int k=index; int i=index*2; for(;i<=len;i*=2){ if(i+1<=len && arr[i]<arr[i+1]){ i++; } if(arr[k]>arr[i]){ break; }else{ arr[k]=arr[i]; k=i; } } arr[i/2]=key; } void build_heap(int len){ for(int i=len/2;i;i--){ my_adjust_heap(i,len); } } void my_heap_sort(int len){ build_heap(len); for(int i=len;i;i--){ cout<<arr[1]<<" "; swap(arr[1],arr[i]); my_adjust_heap(1,i-1); } } void b_sort(){ for(int i=1;i<n;i++){ for(int j=1;j<=n-i;j++){ if(arr[j]>arr[j+1]){ swap(arr[j],arr[j+1]); } } } } void select_sort(){ for(int i=1;i<n;i++){ int index=i; for(int j=i+1;j<=n;j++){ if(arr[j]<arr[index]){ index=j; } } swap(arr[i],arr[index]); } } void insert_sort(){ for(int i=2;i<=n;i++){ if(arr[i]<arr[i-1]){ arr[0]=arr[i]; int j=i-1; for( ;j && arr[0]<arr[j];j--){ arr[j+1]=arr[j]; } arr[j+1]=arr[0]; } } } void b_insert_sort(){ for(int i=2;i<=n;i++){ if(arr[i]<arr[i-1]){ arr[0]=arr[i]; int l=1,r=i-1; while(l<=r){ int m=(l+r)/2; if(arr[0]<=arr[m]){ r=m-1; }else{ l=m+1; } } for(int j=i;j>r+1;j--){ arr[j]=arr[j-1]; } arr[r+1]=arr[0]; } } } void shell_sort(int len){ for(int dk=len/2;dk;dk/=2){ for(int i=dk+1;i<=len;i++){ if(arr[i]<arr[i-dk]){ arr[0]=arr[i]; int j=i-dk; for( ;j && arr[0]<arr[j];j-=dk){ arr[j+dk]=arr[j]; } arr[j+dk]=arr[0]; } } } } int main(){ b_insert_sort(); p(); return 0; }
最新回复(0)