1 #include<iostream> 2 #include<cstdlib> 3 #include<ctime> 4 using namespace std; 5 const int len = 20; 6 //1、冒泡排序 7 void Bubble_sort(int s[],int len){ 8 bool flag; 9 for(int i=1;i<len-1;++i){ 10 flag=false; 11 for(int j=1;j<=len-i;++j) 12 if(s[j]>s[j+1]){flag=true;swap(s[j],s[j+1]);} 13 if(!flag)break; 14 } 15 } 16 //2、选择排序 17 void Select_sort(int s[],int len){ 18 int k; 19 for(int i=1;i<len;++i){ 20 k=i; 21 for(int j=i+1;j<=len;++j) 22 if(s[k]>s[j])k=j; 23 if(k!=i)swap(s[i],s[k]); 24 } 25 } 26 //3、插入排序 27 void Insert_sort(int s[],int len){ 28 for(int i=2;i<=len;++i){ 29 int tmp=s[i],j; 30 for(j=i-1;j>0&&tmp<s[j];--j); 31 for(int k=i;k>j+1;--k)s[k]=s[k-1]; 32 s[j+1]=tmp; 33 } 34 } 35 //4、快速排序 36 int Quick_sort(int s[],int low,int high){ 37 int tmp=s[low];//首元素是枢轴 38 while(low<high){//待排序序列长度大于1 39 while(low<high&&tmp<=s[high])--high;//大于枢轴的元素依旧在右边 40 s[low]=s[high];//将小于枢轴的元素放左边 41 while(low<high&&tmp>=s[low])++low;//小于枢轴的元素依旧在左边 42 s[high]=s[low];//将大于枢轴的元素放右边 43 } 44 s[low]=tmp;//枢轴记录到位 45 return low;//返回枢轴的位置 46 } 47 void Qsort(int s[],int low,int high){ 48 if(low<high){ 49 int key=Quick_sort(s,low,high); 50 Qsort(s,low,key-1); 51 Qsort(s,key+1,high); 52 } 53 } 54 //5、希尔排序(采用直接插入) 55 void Shell_sort(int s[],int len){ 56 for(int step=len/2;step>0;step/=2){//设置步长 57 for(int i=step;i<=len;++i){ 58 int tmp=s[i],j; 59 for(j=i-step;j>0&&tmp<s[j];j-=step); 60 for(int k=i;k>j+step;k-=step)s[k]=s[k-step]; 61 s[j+step]=tmp; 62 } 63 } 64 } 65 //6、归并排序 66 void Merge(int s[],int t[],int low,int mid,int high){ 67 int i=low,j=mid+1,k=low; 68 while(i<=mid&&j<=high){ 69 if(s[i]<=s[j])t[k++]=s[i++]; 70 else t[k++]=s[j++]; 71 } 72 while(i<=mid)t[k++]=s[i++]; 73 while(j<=high)t[k++]=s[j++]; 74 for(int i=low;i<=high;++i)s[i]=t[i];//将区间[low,high]拷贝到原来数组a的位置,表示该区间元素已经排好序 75 } 76 void Merge_sort(int s[],int t[],int low,int high){ 77 if(low<high){ 78 int mid=(low+high)/2; 79 Merge_sort(s,t,low,mid);//递归分成左部分 80 Merge_sort(s,t,mid+1,high);//递归分成右部分 81 Merge(s,t,low,mid,high);//将两部分归并 82 } 83 } 84 //打印数组值 85 void print(int s[],int len){ 86 for(int i=1;i<=len;++i) 87 cout<<s[i]<<(i==len?"\n":" "); 88 } 89 90 int main(){ 91 int *s=new int[len+1]; 92 int *t=new int[len+1];//t为辅助数组 93 srand((unsigned)time(NULL)); 94 for(int i=1;i<=len;++i)s[i]=rand(); 95 print(s,len);//打印原数组 96 /*1、冒泡排序 97 Bubble_sort(s,len);*/ 98 /*2、选择排序 99 Select_sort(s,len);*/ 100 /*3、插入排序 101 Insert_sort(s,len);*/ 102 /*4、快速排序 103 Qsort(s,1,len);*/ 104 /*5、希尔排序 105 Shell_sort(s,len);*/ 106 /*6、归并排序 107 Merge_sort(s,t,1,len);*/ 108 print(s,len);//排序后的数组 109 110 delete[]s;//释放内存 111 delete[]t; 112 return 0; 113 }
原文地址:https://www.cnblogs.com/acgoto/p/9211511.html
时间: 2024-11-01 15:30:57