对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);//合并
    }
}
原文地址:https://www.cnblogs.com/IThaitian/p/2581700.html