美文网首页
排序算法

排序算法

作者: moosoo | 来源:发表于2016-06-23 17:22 被阅读9次
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<set>
#include<map>
#define MAX 100
using namespace std;
int n,a[MAX];
/*冒泡排序*/
void bubblesort(int a[],int n){
     int  tmp;
     for(int i=n-1;i>0;i--){
         for(int j=0;j<i;j++){
             if(a[j]>a[j+1]){  /*比较相邻的两个数,如果前面的数比后面的大,交换顺序*/
                  tmp=a[j];
                  a[j]=a[j+1];
                  a[j+1]=tmp;
              }
          }
      }
      for(int i=0;i<n;i++)  /*输出*/
          cout<<a[i]<<" ";
      cout<<endl;
}

/*选择排序*/
void selectionsort(int a[],int n){
    int tmp,cnt;
    for(int i=0;i<n-1;i++){
         cnt=i;
         /*每次比较找出当前最小值,与未排序部分的第一个数交换位置*/
         for(int j=i+1;j<n;j++)                        
             if(a[cnt]>a[j]) cnt=j;
         if(cnt!=i){
             tmp=a[i];
             a[i]=a[cnt];
             a[cnt]=tmp;
         }
     }
     for(int i=0;i<n;i++) cout<<a[i]<<" ";
     cout<<endl;
}

/*插入排序*/
void insrtsort(int a[],int n){
     for(int i=1;i<n;i++){
         int tmp;
         for(int j=0;j<i;j++){        
         /*将一个数与它前面已排序的数比较,如果找到比它大的数,将这个数到比较数前面的数的位置往后移,将这个数放到找到的位置上*/
              if(a[i]<a[j]){                                           
                  tmp=a[i];
                  for(int k=i-1;k>=j;k--)
                      a[k+1]=a[k];
                   a[j]=tmp;
               }
           }
       }
       for(int i=0;i<n;i++)  cout<<a[i]<<" ";
       cout<<endl;
}

/*计数排序*/
void countsort(int a[],int n){
    int b[5000],size=a[0];
    memset(b,0,sizeof(b));
    for(int i=0;i<n;i++){    /*将要排序的数作为下标,统计每个数出现的次数*/
         b[a[i]]++;
         if(size<a[i])
             size=a[i];
     }
     for(int i=0;i<=size;i++){      /*按数字大小输出出现的数*/
         if(b[i])
             for(int j=0;j<b[i];j++)
                  cout<<i<<" ";
      }
      cout<<endl;
}

/*快速排序*/
void quicksort(int a[],int left,int right){
    if(left<right){                         
        int key=a[left];
        int low=left;
        int high=right;
         while(low<high){   /*所有的数都比较一遍,即i==j结束*/ 
               /*从后往前找找到第一个比key小的数,与low交换*/
               while(low<high&&a[high]>key)     
                     high--;
               a[low]=a[high];
               /*从前往后找找到第一个比key大的数与high交换*/ 
               while(low<high&&a[low]<key)                 
                   low++;
               a[high]=a[low];
          }
           a[low]=key;      /*一次比较确定一个数的位置*/
           quicksort(a,left,low-1);     /*左边的数递归排序*/ 
           quicksort(a,low+1,right);     /*右边的数递归排序*/
     }
}
void qp(){   /*输出*/ 
    quicksort(a,0,n-1);
    for(int i=0;i<n;i++)  cout<<a[i]<<" ";
    cout<<endl;
}

/*归并排序*/ 
void merge(int a[],int b[],int s,int u,int v) {     /*将数组有序的两个部分合并成有序的一个*/ 
    int i=s,j=u+1,q=s;  
    while(i<=u&&j<=v) {    /*两个部分进行比较,小的数放到b数组里*/
         if(a[i]<=a[j])     b[q++]=a[i++];         
         else      b[q++]=a[j++];  
     }    
     while(i<=u)                  /*将剩余元素放到b*/ 
          b[q++]=a[i++];  
     while(j<=v)         
          b[q++]=a[j++];  
}  
void mergepass(int a[],int b[],int n,int t)  { 
    int i=0,j;  
    /*将相邻的两个长度为t的各自有序的子序列合并成一个长度为2t的子序列*/
    while(n-i>=2*t )  {                                
         merge(a,b,i,i+t-1,i+2*t-1);  
         i=i+2*t;  
    }    
    if(n-i>t)      /*若剩下的元素个数大于一个子序列的长度继续排序*/ 
        merge(a,b,i,i+t-1,n-1);  
    else  {       /*若剩下的元素个数小于子序列长度直接将剩下的数赋值*/ 
         for(j=i;j<n;++j )   b[j]=a[j];  
    }
}  
void mergesort(int a[],int n)  {  
    int t=1;  
    int *b=(int *)malloc(sizeof(int) *n); 
    while(t<n)  {           /*排序个数逐渐增大*/
         mergepass(a,b,n,t);  
         t*=2;  
         mergepass(b,a,n,t);  
         t*=2;  
     }  
free(b); 
}  
void mp(){
     mergesort(a,n);
     for(int i=0;i<n;i++)  cout<<a[i]<<" ";
     cout<<endl;
} 

/*堆排序*/
void heapadjust(int a[],int i,int n){            
    int lchild=2*i;
    int rchild=2*i+1;
    int maxn=i;
    if(i<=n/2){   /*将叶节点和跟节点进行比较,最大的成为跟节点*/
        if(lchild<=n&&a[lchild]>a[maxn])  maxn=lchild;
        if(rchild<=n&&a[rchild]>a[maxn])  maxn=rchild;
         int tmp;
         if(maxn!=i){
             tmp=a[i];
             a[i]=a[maxn];
             a[maxn]=tmp;
             heapadjust(a,maxn,n);
         }
    }
} 
void buildheap(int a[],int n){             /*建堆*/
    for(int i=n/2;i>0;i--)  heapadjust(a,i,n);
} 
void heapsort(int a[],int n){
    buildheap(a,n);
    int tmp;
    int i;
    for(i=n;i>0;i--){
         tmp=a[1];
         a[1]=a[i];
         a[i]=tmp;
         heapadjust(a,1,i-1);
    }
}
void hp(){
    heapsort(a,n);
    for(int i=1;i<=n;i++)  cout<<a[i]<<" ";
    cout<<endl;
}
int main(){
    while(cin>>n){
         for(int i=0;i<n;i++)   cin>>a[i];
         bubblesort(a,n);
         selectionsort(a,n);
         insrtsort(a,n);
         countsort(a,n);
         qp();
         mp();
         for(int i=n;i>0;i--)    /*为了方便,将所有数的下标加一*/
             a[i]=a[i-1];
         hp();
     }
     return 0;
}

相关文章

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 算法学习(1)-排序算法

    八大排序算法九大排序算法再总结[经典排序算法][集锦][直观学习排序算法] 视觉直观感受若干常用排序算法 快速排序...

  • 经典排序算法总结

    经典排序算法集锦 冒泡法 排序算法入门之冒泡排序 排序算法入门之冒泡排序优化

  • 前端算法学习-第一篇

    冒泡排序算法 冒泡排序算法是最慢的排序算法之一,也是最容易实现的排序算法。之所以叫冒泡排序是因为使用这种算法排序时...

  • 七大排序算法之冒泡排序

    七大排序算法之冒泡排序 @(算法笔记)[排序算法, 冒泡排序, C++实现] 冒泡排序介绍 冒泡排序是七大排序算法...

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • 浅谈排序算法

    排序算法有很多种,今天先谈谈一些简单的排序算法。包括桶排序、冒泡排序和快速排序算法。后期总结各种排序算法。 桶排序...

  • 线性排序

    桶排序、计数排序、基数排序 一、线性排序算法介绍 1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法...

  • 算法4:插入排序和选择排序算法的比较

    排序算法列表电梯: 选择排序算法:详见 《算法4》2.1 - 选择排序算法(Selection Sort), Py...

网友评论

      本文标题:排序算法

      本文链接:https://www.haomeiwen.com/subject/effodttx.html