排序方法汇总

来源:互联网 发布:淘宝客招人 编辑:程序博客网 时间:2024/05/16 06:04

以下是各种排序方法的汇总,仅当参考

#include<stdio.h>#include<stdlib.h>#define SIZE 5//模拟选择排序void ChoiceSort(int *arr,int n){int i=0,j,min,temp;for(i=0;i<n-1;i++){min=i;for(j=i+1;j<n;j++){if(arr[j]<=arr[min])min=j;//将其下标赋予min}//交换temp=arr[i];arr[i]=arr[min];arr[min]=temp;}}//模拟插入排序void InsertSort(int *arr,int n){int i,j,next;for(i=1;i<n;i++)//i从1开始,插入前面的表中{next=arr[i];//next指向要排序的下一个值/*写法一for(j=i-1;j>=0;j--)if(arr[j]>next)arr[j+1]=arr[j];//元素后移一位elsebreak;arr[j+1]=next;//将元素插入表头*///写法二for(j=i-1;j>=0 && arr[j]>next;j--)arr[j+1]=arr[j];arr[j+1]=next;}}//折半插入综合法(根据折半方法找到插入的位置)void InsertByBinaty(int *arr,int n){int i,j,next;int right,left,mid;for(i=1;i<n;i++){next=arr[i];right=i-1;left=0;while(left<=right)//搜索插入的位置{mid=(right+left)>>1;//右移一位(相当于除以2)if(arr[mid]>next)right=mid-1;elseleft=mid+1;}for(j=i-1;j>=right+1;j--)//从最后一个处开始右移arr[j+1]=arr[j];//元素右移arr[right+1]=next;}}//模拟冒泡排序void BuffSort(int *arr,int n){int i,j,temp;for(i=0;i<n;i++){for(j=0;j<n-i;j++)//要交换的圈数{if(arr[j]>arr[j+1])//两两交换{temp=arr[j+1];arr[j+1]=arr[j];arr[j]=temp;}}}}//快速排序void QuickSort(int *arr,int left,int right){int i,j,prov,temp;if(left<right){i=left;j=right+1;prov=arr[left];//保存最左边的那个值do{do{i++;}while(arr[i]<prov);//找出前半部分大于第一个元素值的位置do{j--;}while(arr[j]>prov);//找出后半部分小于第一个元素值的位置if(i<j){temp=arr[i];arr[i]=arr[j];arr[j]=temp;}}while(i<j);temp=arr[left];arr[left]=arr[j];arr[j]=temp;//递归调用QuickSort(arr,left,j-1);QuickSort(arr,j+1,right);}}/*int main(){int array[SIZE]={9,7,18,6,4};int i;printf("The Array Before Sort is:\n");for(i=0;i<SIZE;i++)printf("%d ",array[i]);printf("\n");printf("The Array After Sort is:\n");//ChoiceSort(array,SIZE);//InsertSort(array,SIZE);//InsertByBinaty(array,SIZE);//BuffSort(array,SIZE);QuickSort(array,0,SIZE-1);for(i=0;i<SIZE;i++)printf("%d ",array[i]);printf("\n");system("pause");return 0;}*///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////归并排序/*#include<stdio.h>#include<stdlib.h>#define M 5void MergeSort(int list[],int sorted[],int m,int n){int i=0,j=m,k=0;while(i<m && j<n){if(list[i]<=list[j])//选择小的元素排在列表的前面sorted[k++]=list[i++];elsesorted[k++]=list[j++];}if(i>m)//复制后面的元素while(j<n)sorted[k++]=list[j++];elsewhile(i<m)sorted[k++]=list[i++];}//归并排序的迭代算法void Merge_Pass(int list[],int sorted[],int n,int length){int i,j;for(i=0;i<=n-2*length;i+=2*length)MergeSort(list,sorted,i+length-1,i+2*length-1);//调用函数if(i+length<n)MergeSort(list,sorted,i+length-1,n-1);elsefor(j=i;j<n;j++)sorted[j]=list[j];}//模拟实现void merge(int list[],int n){int len=1,i;int arr[M+M];while(len<n){Merge_Pass(list,arr,n,len);len*=2;Merge_Pass(arr,list,n,len);len*=2;}for(i=0;i<2*M;i++)printf("%d ",arr[i]);printf("\n");}int main(){//4,12,22,31,45,5,8,27,35,39int list[M+M]={4,12,35,22,67,34,2,38,88,11};//int sort[M+M],i;printf("The list1,list2 Merge is:\n");//MergeSort(list,sort,M,M+M);merge(list,M+M);/*for(i=0;i<2*M;i++)printf("%d ",sort[i]);printf("\n");system("pause");return 0;}*/


 

原创粉丝点击