当前位置:   article > 正文

各种排序方法的c++实现

各种排序方法的c++实现

  数据结构这本书里的许多知识点可谓面试的常客,其中排序算法更是频繁出现。为了加深理解和牢记这些排序算法,我们有必要对这些算法自己实现一遍,并作相应的总结。

  pre:许多排序算法都会用到swap函数,作用很简单,交换a[i]与a[j]的值。

  

  1. void swap(int a[],int i,int j)
  2. {
  3. int temp = a[i];
  4. a[i] = a[j];
  5. a[j] = temp;
  6. }

      测试代码:

 

 

  1. int main()
  2. {
  3. int a[8] = {5,3,7,2,9,10,8,6};
  4. InsertSort(a,8);
  5. for(int i=0;i<8;i++){
  6. cout<<a[i]<<" ";
  7. }
  8. return 0;
  9. }

 

 

 

 

 

1.      冒泡排序

         冒泡排序基本思想:从数组末尾开始,每次将最小的数调整至数组开头,正所谓冒泡。

  

  1. void BubbleSort(int a[],int n)
  2. {
  3. int i,j;
  4. for(i=0;i<n-1;i++){
  5. for(j=n-1;j>i;j--){
  6. if(a[j]<a[j-1])
  7. swap(a,j,j-1);
  8. }
  9. }
  10. }

 

 

 

2.      简单选择排序

         感觉这个排序和冒泡有点像啊,每次选择一个最小值放到i位,然后i++。

 

  1. void SelectSort(int a[],int n)
  2. {
  3. int i,j,m;
  4. for(i=0;i<n-1;i++){
  5. m=i;
  6. for(j=i+1;j<n;j++){
  7. if(a[j]<a[m])
  8. m=j;
  9. }
  10. if(i!=m)
  11. swap(a,i,m);
  12. }
  13. }

 

 

 

 

 

3.      直接插入排序

         插入排序类似于玩扑克牌时的排序方法,从i=1开始,当前数比后数大时开始外循环,然后内循环把a[i]插入到之前比a[i]大的数之前,注意两个限制条件不能少,保证前数较小时不再插入。

 

  1. void InsertSort(int a[],int n)
  2. {
  3. int i,j,temp;
  4. for(i=1;i<n;i++){
  5. if(a[i]<a[i-1]){
  6. temp=a[i];
  7. for(j=i-1;a[j]>temp && j>=0;j--)
  8. a[j+1]=a[j];
  9. a[j+1]=temp;
  10. }
  11. }
  12. }

 

 

 

 

 

4.      希尔排序

         希尔排序实际就是插入排序的改进版,引如一个increment增量,使得序列通过几次操作变得“基本有序”,这样后续的插入操作会大大减少,这样直接排序的优势也就显现出来了。

 

  1. void ShellSort(int a[],int n)
  2. {
  3. int i,j,tmp;
  4. int increment=n;
  5. do
  6. {
  7. increment=increment/3+1;
  8. for(i=increment;i<n;i++)
  9. {
  10. if(a[i]<a[i-increment])
  11. {
  12. tmp=a[i];
  13. for(j=i-increment;j>=0&&tmp<a[j];j-=increment)
  14. a[j+increment]=a[j];
  15. a[j+increment]=tmp;
  16. }
  17. }
  18. }while(increment>1);
  19. }

 

 

 

 

 

5.      堆排序

         堆排序的思想是利用大顶堆的性质,即k[i]>=k[2i],每次把顶上的最大值取走,再重新调整为大顶堆,然后再取,再调整......直至完成有序排列。

         代码分为两部分,首先是主码HeapSort。

 

  1. void HeapSort(int a[],int n)
  2. {
  3. int i;
  4. for(i=n/2-1;i>=0;i--)
  5. HeapAdjust(a,i,n-1);
  6. for(i=n-1;i>0;i--){
  7. swap(a,0,i);
  8. HeapAdjust(a,0,i-1);
  9. }
  10. }

      然后是最为关键的HeapAdjust函数,将交换后的序列重新调整为大顶堆。

 

 

  1. void HeapAdjust(int a[],int s,int m)
  2. {
  3. int i,j;
  4. int temp=a[s];
  5. for(j=2*s+1;j<=m;j=2*j+1){
  6. if(j<m && a[j]<a[j+1])
  7. ++j;
  8. if(temp>=a[j])
  9. break;
  10. a[s]=a[j];
  11. s=j;
  12. }
  13. a[s]=temp;
  14. }

https://baike.baidu.com/item/%E5%A0%86%E6%8E%92%E5%BA%8F/2840151?fr=kg_qa 关于堆排序,百度百科里的代码实现和注释非常详尽,遂转于此。

 

 

 

 

 

 

6.      归并排序

归并排序的Merge函数实现这样一个功能:将两个有序序列合并为一个有序序列。

 

  1. void Merge(int a[],int b[],int i,int m,int n)
  2. {
  3. int j,k,l;
  4. for(j=m+1,k=i;i<=m && j<=n;k++)
  5. {
  6. if(a[i]<a[j])
  7. b[k]=a[i++];
  8. else
  9. b[k]=a[j++];
  10. }
  11. if(i<=m)
  12. {
  13. for(l=0;l<=m-i;l++)
  14. b[k+l]=a[i+l];
  15. }
  16. if(j<=n)
  17. {
  18. for(l=0;l<=n-j;l++)
  19. b[k+l]=a[j+l];
  20. }
  21. }

这里就是把序列a的i到m当做一个序列,m+1到n当做另一个序列,然后合并成b序列。

  1. void MergeSort(int a[],int b[],int s,int t)
  2. {
  3. int m;
  4. int tmp[8];
  5. if(s==t)
  6. b[s]=a[s];
  7. else
  8. {
  9. m=(s+t)/2;
  10. MergeSort(a,tmp,s,m);
  11. MergeSort(a,tmp,m+1,t);
  12. Merge(tmp,b,s,m,t);
  13. }
  14. }

 

 

 

 

 

7.      快速排序

快排的Partion函数返回一个povit所在的位置,使得povit位置左边的数全都比povit位置的数小,右边全都比它大。

 

  1. int Partion(int a[],int low,int high)
  2. {
  3. int povitkey=a[low];
  4. while(low<high)
  5. {
  6. while(low<high && povitkey<=a[high])
  7. high--;
  8. swap(a,low,high);
  9. while(low<high && povitkey>=a[low])
  10. low++;
  11. swap(a,low,high);
  12. }
  13. return low;
  14. }


快排的主函数,对povit左边和右边递归调用QuickSort以达到排序效果。

 

 

  1. void QuickSort(int a[],int low,int high)
  2. {
  3. int povit;
  4. if(low<high)
  5. {
  6. povit=Partion(a,low,high);
  7. QuickSort(a,low,povit-1);
  8. QuickSort(a,povit+1,high);
  9. }
  10. }


未完待续,欢迎补充,代码都是测试通过的,有不足之处(本人新手,肯定很多)欢迎指正!

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/658243
推荐阅读
相关标签
  

闽ICP备14008679号