标签:网上 选择排序 基本 快排 二分 -- min 数据 shellSort
本篇博客是为了熟悉冒泡选择插入希尔归并快速基数排序这几种排序算法而写的,基本上是看了书上代码,然后自己手敲理解一遍。
1 #include <bits/stdc++.h> 2 using namespace std; 3 int lis1[9]={24,46,36,42,68,84,22,48,66}; 4 int lis2[9]={24,46,36,42,68,84,22,48,66}; 5 int n=9; 6 7 void turnlisbace() 8 { 9 for (int i=0;i<n;i++) 10 lis1[i]=lis2[i]; 11 } 12 13 void output(int lis[],int n) 14 { 15 for (int i=0;i<n;i++) 16 cout<<lis[i]<<" "; 17 cout<<endl; 18 } 19 20 void InsertSort(int a[],int n) //插入排序 21 { 22 int temp,j; 23 for (int i=1;i<n;i++) 24 { 25 temp=a[i]; 26 for (j=i-1;j>=0;j--) 27 { 28 if (a[j]>temp) 29 a[j+1]=a[j]; 30 else 31 break; 32 }//此处跳出循环时,a[j]<temp,所以temp插入到j的后一位(j+1)。 33 a[j+1]=temp; 34 } 35 cout<<"The result of insertsort is here:"<<endl; 36 output(a,n); 37 cout<<endl; 38 } 39 40 void InsertSort_twodiv(int a[],int n) //二分插入排序 41 { 42 int temp,j,low,high,mid; 43 for (int i=1;i<n;i++) 44 { 45 temp=a[i]; 46 low=0;high=i-1; 47 while (low<=high) //通过二分的方法找到已有序的部分里插入的位置 48 { 49 mid=(high+low)/2; 50 if (a[mid]>temp) 51 high=mid-1; 52 else 53 low=mid+1; 54 } 55 for (j=i-1;j>=high+1;j--) 56 a[j+1]=a[j]; 57 a[j+1]=temp; 58 } 59 cout<<"The result of insersort_twodiv is here:"<<endl; 60 output(a,n); 61 cout<<endl; 62 } 63 64 void SelectSort(int a[],int n) //选择排序 65 { 66 for (int i=0;i<n-1;i++) //进行n-1趟排序,因为n-1的数确定好了位置,第n个数也确定好了位置 67 { 68 int mintemp=i,j; 69 for (j=i;j<n;j++) 70 { 71 if (a[j]<a[mintemp]) 72 mintemp=j; 73 } 74 swap(a[i],a[mintemp]); 75 } 76 cout<<"The result of selectsort is here:"<<endl; 77 output(a,n); 78 cout<<endl; 79 } 80 81 void ShellSort(int a[],int n) //希尔排序 82 { 83 int temp,j; 84 for (int step=n/2;step>=1;step/=2) 85 { 86 for (int i=step;i<n;i++) 87 { 88 temp=a[i]; 89 for (j=i-step;j>=0 && a[j]>temp;j-=step) 90 a[j+step]=a[j]; 91 a[j+step]=temp; 92 } 93 } 94 cout<<"The result of shellsort is here:"<<endl; 95 output(a,n); 96 cout<<endl; 97 } 98 99 void BubbleSort(int a[],int n) //冒泡排序 100 { 101 bool flag=true; 102 for (int i=0;i<n;i++) 103 { 104 for (int j=n-1;j>=i;j--) 105 { 106 if (a[j]<a[j-1]) 107 { 108 swap(a[j],a[j-1]); 109 flag=false; 110 } 111 } 112 if (flag==true) 113 break; 114 } 115 cout<<"The result of bubblesort is here:"<<endl; 116 output(a,n); 117 cout<<endl; 118 } 119 120 //快速排序,快速排序需要两个函数完成 121 //取标准轴函数,同时在这里完成大于标准轴的数放在右边,小于标准轴的放在左边的操作 122 int Partition(int a[],int low,int high) 123 { 124 int standardint =a[low]; 125 while (low<high) 126 { 127 while (a[high]>=standardint && low<high) //左边数满足时候,high--,寻找到不满足的赋值到右边 128 high--; //(右边下标处为刚刚不满足的值(或为标准值),所以不会发生丢失) 129 a[low]=a[high]; 130 while (a[low]<=standardint && low<high) //右边数满足时,low++,寻找到不满足的赋值到左边 131 low++; //(左边下标处为刚刚不满足的值,所以不会发生丢失) 132 a[high]=a[low]; 133 } 134 a[low]=standardint; //将标准值赋值到中间位置,此时,大于的值在右,小于值在左 135 return low; 136 } 137 void QuickSort(int a[],int low,int high) //使用递归的手法,依次向下快排 138 { 139 if (low<high) 140 { 141 int Pivot=Partition(a,low,high); 142 QuickSort(a,low,Pivot-1); 143 QuickSort(a,Pivot+1,high); 144 } 145 } 146 147 //归并排序,同样需要两个函数完成 148 void merge(int a[],int low,int mid,int high) //将low——mid,mid+1——high的的两个数组归并到一起 149 { 150 int b[high-low+1]; 151 int i,j,k; 152 for (i=low,j=mid+1,k=0;i<=mid && j<=high;k++) 153 { 154 if (a[i]<a[j]) 155 b[k]=a[i++]; 156 else 157 b[k]=a[j++]; 158 } 159 while (i<=mid) 160 b[k++]=a[i++]; 161 while (j<=high) 162 b[k++]=a[j++]; 163 for (i=low,k=0;i<=high;i++) 164 a[i]=b[k++]; 165 } 166 void MergeSort(int a[],int low,int high) //同样使用递归函数 167 { 168 if (low<high) 169 { 170 int mid=(low+high)/2; 171 MergeSort(a,low,mid); 172 MergeSort(a,mid+1,high); 173 merge(a,low,mid,high); 174 } 175 } 176 177 //基数排序,参考网上的,目前还没仔细理解代码 178 int max(int date[],int n) 179 { 180 int max=0; 181 for(int i=0;i<n;i++){ 182 int count=1,tem=date[i]; 183 while(tem/10!=0){ 184 tem=tem/10; 185 count++; 186 } 187 if(count>max) 188 max=count; 189 } 190 return max; 191 } 192 void BaseSort(int date[],int n) 193 { 194 int maxx=max(date,n); 195 int num=1; 196 for(int i=0;i<maxx;i++) 197 { 198 int count[10]; 199 int temp[10][‘n‘]; 200 for(int f=0;f<10;f++) 201 { 202 count[f]=0; 203 } 204 for(int g=0;g<10;g++) 205 { 206 for(int z=0;z<n;z++){ 207 temp[g][z]=0; 208 } 209 } 210 for(int j=0;j<n;j++) 211 { 212 int fg=date[j]/num; 213 int k=fg%10; 214 count[k]++; 215 int te=count[k]-1; 216 temp[k][te]=date[j]; 217 } 218 int b=0; 219 for(int h=0;h<10;h++){ 220 if(count[h]>0) 221 { 222 for(int v=0;v<count[h];v++) 223 { 224 date[b]=temp[h][v]; 225 b++; 226 } 227 } 228 } 229 num=num*10; 230 } 231 cout<<"The result of basesort is here:"<<endl; 232 output(date,n); 233 cout<<endl; 234 } 235 236 237 int main() 238 { 239 InsertSort(lis1,n); 240 turnlisbace(); 241 InsertSort_twodiv(lis1,n); 242 turnlisbace(); 243 SelectSort(lis1,n); 244 turnlisbace(); 245 ShellSort(lis1,n); 246 turnlisbace(); 247 BubbleSort(lis1,n); 248 turnlisbace(); 249 QuickSort(lis1,0,n-1); 250 cout<<"The result of quicksort is here:"<<endl; 251 output(lis1,n); 252 cout<<endl; 253 turnlisbace(); 254 MergeSort(lis1,0,n-1); 255 cout<<"The result of mergesort is here:"<<endl; 256 output(lis1,n); 257 cout<<endl; 258 turnlisbace(); 259 BaseSort(lis1,n); 260 return 0; 261 }
标签:网上 选择排序 基本 快排 二分 -- min 数据 shellSort
原文地址:https://www.cnblogs.com/Notherthing-hyc/p/11762077.html