码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构-排序算法

时间:2019-10-30 00:08:44      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:网上   选择排序   基本   快排   二分   --   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!