#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);//合并 } }