zoukankan      html  css  js  c++  java
  • 对N个整数进行排序(各类排序)

    #include<stdio.h>
    #include"Function.h"
    int main()
    {
        int Array[1000]={0};
        int N,k,index;
        int i;
        scanf("%d",&N);
        for(i=0;i<N;i++)
            scanf("%d",&Array[i]);
    
        /////排序(从小到大)
        selection_sort(Array,N);
        //bubble_sort(Array,N);
        //Quick_sqort(Array,0,N-1);
        //merge_sort(Array,0,N-1);
        //heap_sort(Array, N);(降序)
        for(i=0;i<N;i++)
              printf("%d ",Array[i]);
        
        return 0;
    }

    Function.h

    void selection_sort(int Array[],int N);//选择排序
    void bubble_sort(int Array[],int N);//冒泡排序
    void Quick_sqort(int Arr[],int begin,int end);//快速排序
    void merge_sort(int Arr[],int begin,int end);//归并排序
    void heap_sort(int *array, int n);//堆排序


    Source Files

    #include"Function.h"
    void selection_sort(int Array[],int N)//选择排序(升序)
    {
        int i,j,k,temp;
        for(i=0;i<N;i++)//为下标为i的数组元素寻找最大值(i之后部分中)
        {
            k=i;//k用于标记当前一轮中最小值的下标
            for(j=i+1;j<N;j++)
                if(Array[j]<Array[k])    k=j;
            temp=Array[i];
            Array[i]=Array[k];
            Array[k]=temp;    
        }
    
    }
    #include"Function.h"
    void bubble_sort(int Array[],int N)//冒泡排序(升序)
    {
        int i,j,temp;
        for(i=0;i<N;i++)
            for(j=1;j<N-i;j++)//两个数才可能有冒泡
               if(Array[j-1]>Array[j])//若能,每次冒泡给Array[j]
               {
                   temp=Array[j-1];
                   Array[j-1]=Array[j];
                   Array[j]=temp;
               }
    }
    #include"Function.h"
    //快速排序(升序)(分治)
    int partition(int Arr[],int be,int en)//选取极端的测例:5 4 3 2 1 排成小到大
    {
       int i,j;
       int temp;
       i=be+1;   j=en;
       while(i<=j)//注意"<="而不是"<"//当i==j时说明该次划分只剩两个数,还得继续划分,否则while之后的代码会打乱排好的序
       {      
           while(Arr[i]<=Arr[be] &&i<=en)   i++;     //与首元素相等的放在左边         
           while(Arr[j]> Arr[be] &&j>=be)   j--;
           if(i<j)
           {   temp=Arr[i];
               Arr[i]=Arr[j];
               Arr[j]=temp;
           }
       }   
       temp=Arr[be];      //当i>j,i总会在跑到第一个Arr[i]>Arr[begin]处停下来
       Arr[be]=Arr[j];    //      j总会在跑到第一个Arr[j]<Arr[begin]处停下来
       Arr[j]=temp;
       
       return j;
    }
    void Quick_sqort(int Arr[],int begin,int end)
    {
        if(begin<end)//起点位置小于等于终点位置,不再划分
        {
             int mid=partition(Arr,begin,end);
             Quick_sqort(Arr,begin,mid-1);
             Quick_sqort(Arr,mid+1,end);
        }
    }
    #include"Function.h"
    //归并排序(升序)(分治)
    void merge(int Arr[],int begin,int mid,int end)//合并
    {
        int i,j,k=0;
        int List[1000]={0};
        for(i=begin,j=mid+1; i<=mid&&j<=end; )
            if(Arr[i]<Arr[j])    List[k++]=Arr[i++]; 
            else   List[k++]=Arr[j++]; 
        while(i<=mid)
             List[k++]=Arr[i++]; 
        while(j<=end)
             List[k++]=Arr[j++]; 
    
        k=0;
        for(i=begin; i<=end; i++)
            Arr[i]=List[k++];
    }
    void merge_sort(int Arr[],int begin,int end)//归并排序
    {
        int mid;
        if(begin<end)
        {  
            mid=(begin+end)/2;//划分
            merge_sort(Arr,begin,mid);
            merge_sort(Arr,mid+1,end);
            merge(Arr,begin,mid,end);//合并
        }
    }
  • 相关阅读:
    Luogu P4071 [SDOI2016]排列计数
    CF 961E Tufurama
    Luogu P2057 [SHOI2007]善意的投票
    Luogu P2756 飞行员配对方案问题
    POJ2151
    POJ 3349&&3274&&2151&&1840&&2002&&2503
    POJ 2388&&2299
    EZ 2018 03 30 NOIP2018 模拟赛(六)
    POJ 1459&&3436
    BZOJ 1001: [BeiJing2006]狼抓兔子
  • 原文地址:https://www.cnblogs.com/IThaitian/p/2581700.html
Copyright © 2011-2022 走看看