八大经典算法代码

  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 }

猜你喜欢

转载自www.cnblogs.com/moumangtai/p/10055761.html
今日推荐