1. 程式人生 > >八大經典演算法程式碼

八大經典演算法程式碼

  1 #include <iostream>
  2 #include <string.h>
  3 #include <malloc.h>
  4 #include <cstdio>
  5 using namespace std;
  6 //氣泡排序
  7 void bubble_sort(long a[],int n)
  8 {
  9     for(int i=0;i<n-1;i++)
 10     {
 11         for(int j=0;j<n-1-i;j++)
 12         {
 13             if
(a[j]>a[j+1]) 14 { 15 long temp = a[j]; 16 a[j] = a[j+1]; 17 a[j+1] = temp; 18 } 19 } 20 } 21 } 22 //選擇排序 23 void select_sort(long a[],int n) 24 { 25 for(int i=0;i<n-1;i++) 26 { 27 int
min = a[i]; 28 int k=i; 29 for(int j=i+1;j<n;j++){ 30 if(a[j]<min) 31 { 32 min = a[j]; 33 k=j; 34 } 35 } 36 if(k!=i) 37 { 38 int temp = a[i]; 39 a[i]=a[k];
40 a[k]=temp; 41 } 42 } 43 } 44 //插入排序 45 void insert_sort(long a[],int n) 46 { 47 for(int i=1;i<n;i++) 48 { 49 int j=i-1; 50 long temp = a[i]; 51 while(j>=0 && a[j]>temp) 52 { 53 a[j+1]=a[j]; 54 j--; 55 } 56 a[j+1] = temp; 57 } 58 } 59 //希爾排序 60 void shell_sort(long a[],int n) 61 { 62 int gap = 1; 63 while(gap < n/3) gap = gap*3+1; 64 for(gap;gap>0;gap/=2) 65 { 66 for(int i=gap;i<n;i++) 67 { 68 int temp = a[i]; 69 int j; 70 for(j=i-gap;j>=0&&a[j]>temp;j-=gap) 71 { 72 a[j+gap]=a[j]; 73 } 74 a[j+gap] = temp; 75 } 76 } 77 } 78 //歸併排序 79 void merge_he(long a[],int left,int mid,int right,long *temp) 80 { 81 int i=left; 82 int j=mid+1; 83 int k=left; 84 while(i<=mid && j<=right) 85 { 86 if(a[i]<a[j]) 87 { 88 temp[k++]=a[i++]; 89 } 90 else if(a[i]>=a[j]) 91 { 92 temp[k++]=a[j++]; 93 } 94 } 95 while(i<=mid) 96 { 97 temp[k++]=a[i++]; 98 } 99 while(j<=right) 100 { 101 temp[k++]=a[j++]; 102 } 103 memcpy(a+left,temp+left,sizeof(long)*(right-left+1)); 104 } 105 void merge_fen(long a[],int left,int right,long *temp) 106 { 107 if(left < right) 108 { 109 int mid = left + (right - left)/2; 110 merge_fen(a,left,mid,temp); 111 merge_fen(a,mid+1,right,temp); 112 merge_he(a,left,mid,right,temp); 113 } 114 } 115 void merge_sort(long a[],int n) 116 { 117 long *temp = (long *)malloc(sizeof(long)*n); 118 merge_fen(a,0,n-1,temp); 119 free(temp); 120 } 121 //快速排序 122 void quick(long a[],int left,int right) 123 { 124 if(left<right) 125 { 126 int i=left; 127 int j=right; 128 long temp = a[i]; 129 while(i<j) 130 { 131 while(i<j&&a[j]>temp) j--; 132 if(i<j) a[i++]=a[j]; 133 while(i<j&&a[i]<temp) i++; 134 if(i<j) a[j--]=a[i]; 135 } 136 a[i]=temp; 137 quick(a,left,i-1); 138 quick(a,i+1,right); 139 } 140 } 141 void quick_sort(long a[],int n) 142 { 143 quick(a,0,n-1); 144 } 145 146 //堆排序 147 void heap(long a[],int parent,int n) 148 { 149 int child = 2*parent+1; 150 long temp = a[parent]; 151 while(child < n) 152 { 153 if(child+1 <n && a[child] < a[child+1]) 154 { 155 child++; 156 } 157 if(a[child] < temp) 158 break; 159 160 a[parent] = a[child]; 161 162 parent = child; 163 child = 2*parent +1; 164 } 165 a[parent] = temp; 166 } 167 void heap_sort(long a[],int n) 168 { 169 for(int i=n/2-1;i>=0;i--) 170 heap(a,i,n); 171 172 for(int i=n-1;i>0;i--) 173 { 174 int temp = a[0]; 175 a[0] = a[i]; 176 a[i] = temp; 177 178 heap(a,0,i); 179 } 180 } 181 182 //基數排序 183 long get_max(long a[],int n) 184 { 185 long max = a[0]; 186 for(int i=1;i<n;i++) 187 { 188 if(a[i]>max) 189 max = a[i]; 190 } 191 return max; 192 } 193 void radix_sort(long a[],int n) 194 { 195 long bucket[10][n]; // 196 int count[10]={0}; //記錄每個桶中存入數的個數 197 198 long max = get_max(a,n); 199 for(long i=1;max/i>0;i*=10) 200 { 201 for(int j=0;j<n;j++) 202 { 203 int num = (a[j]/i)%10; 204 bucket[num][count[num]]=a[j]; 205 count[num]++; 206 } 207 int c=0; 208 for(int i=0;i<10;i++) 209 { 210 if(count[i]!=0) 211 { 212 for(int j=0;j<count[i];j++) 213 { 214 a[c++] = bucket[i][j]; 215 } 216 } 217 count[i]=0; 218 } 219 } 220 } 221 int main() 222 { 223 224 int n; 225 scanf("%d",&n); 226 long a[n]; 227 for(int i=0;i<n;i++) 228 { 229 scanf("%ld",&a[i]); 230 } 231 radix_sort(a,n); 232 for(int i=0;i<n;i++) 233 { 234 if(i!=0) printf(" "); 235 printf("%ld",a[i]); 236 } 237 }