标签:
#include<stdio.h> #include<stdlib.h> typedef int ElementType; void Swap(int &a,int &b) {int n;n=a,a=b,b=n;} //--简单排序-- //冒泡排序 void Bubble_Sort(ElementType A[],int N) { int flag; for(int P=N-1;P>=0;P--) { flag=0; for(int i=0;i<P;i++) if(A[i]>A[i+1]) { Swap(A[i],A[i+1]); flag=1; } if(!flag) break; } } //插入排序 void Insertion_Sort(ElementType A[],int N) { int i,tmp; for(int P=1;P<N;P++) { tmp=A[P]; for(i=P;i>0 && A[i-1]>tmp;i--) A[i]=A[i-1]; A[i]=tmp; } } //希尔排序(插入排序的改进)// void Shell_Sort(ElementType A[],int N) { int i,tmp,D; for(D=N/2;D>0;D/=2) //希尔增量序列 { for(int P=D;P<N;P++) { tmp=A[P]; for(i=P;i>=D && A[i-D]>tmp;i-=D) A[i]=A[i-D]; A[i]=tmp; } } } //堆排序 void Selection_Sort(ElementType A[],int N) { int i,MinPosition; for(i=0;i<N;i++) { MinPosition = ScanForMin(A,i,N-1); /*从A[i]到A[N-1]找到最小元;用最小堆*/ if(MinPosition!=i) Swap(A[i],A[MinPosition]); } } void Heap_Sort(ElementType A[],int N) /*应用效果可能不如 */ { /* Sedgewick的希尔序列*/ int i; /* ElementType TmpA[N]; Create(H); BuildMinHeap(H); for(i=0;i<N;i++) TmpA[i]=DeleteMin(H); for(i=0;i<N;i++) A[i]=TmpA[i]; */ for(i=N/2;i>=0;i--) //BuildMinHeap PercDown(A,i,N); for(i=N-1;i>0;i--) { Swap(A[0],A[i]); //DeleteMax PercDown(A,0,i); } } //归并排序///////////////////////////////// ////////////// //////////////////////////////////////// ///////////////// /*核心:有序子列的归并;*/ void Merge(ElementType A[],ElementType TmpA[], int L,int R,int RightEnd) { int LeftEnd,Tmp,NumElements; LeftEnd = R-1; Tmp = L; NumElements = RightEnd - L + 1; while(L<=LeftEnd && R<=RightEnd) { if(A[L] <= A[R]) TmpA[Tmp++]=A[L++]; else TmpA[Tmp++]=A[R++]; } while(L<=LeftEnd) TmpA[Tmp++]=A[L++]; while(R<=RightEnd) TmpA[Tmp++]=A[R++]; for(int i = 0;i < NumElements ; i++, RightEnd--) A[RightEnd]=TmpA[RightEnd]; } //递归算法,分割成小块 ////////////////////////////// void MSort(ElementType A[],ElementType TmpA[], int L,int RightEnd) { int Center; if(L < RightEnd) { Center=(L + RightEnd) / 2; MSort(A,TmpA,L,Center); MSort(A,TmpA,Center+1,RightEnd); Merge(A,TmpA,L,Center+1,RightEnd); } } void Merge_Sort(ElementType A[],int N) { ElementType *TmpA; TmpA = (ElementType *)malloc(N*sizeof(ElementType)); if(TmpA!=NULL) { MSort(A,TmpA,0,N-1); free(TmpA); } else Error("空间不足"); } //非递归算法//////////////////////////////////////// void Merge_pass(ElementType A[],ElementType TmpA[], int N,int length) //length = 当前有序子列长度 { int i; for(i=0;i <= N-2*length;i+=2*length) Merge1(A,TmpA,i,i+length,N-1); if(i+length<N) Merge1(A,TmpA,i,i+length,N-1); else for(int j = 1;j<N;j++) TmpA[j] = A[j]; } void Merge_Sort(ElementType A[],int N) { int length = 1; ElementType *TmpA; TmpA = (ElementType*)malloc(N*sizeof(ElementType)); if(TmpA!=NULL ) { while(length < N) { Merge_pass(A,TmpA,N,length); length*=2; Merge_pass(TmpA,A,N,length); length*=2; } free(TmpA); } else Error("空间不足"); } void Merge1(ElementType A[],ElementType TmpA[], int L,int R,int RightEnd) { int LeftEnd,Tmp,NumElements; LeftEnd = R-1; Tmp = L; NumElements = RightEnd - L + 1; while(L<=LeftEnd && R<=RightEnd) { if(A[L] <= A[R]) TmpA[Tmp++]=A[L++]; else TmpA[Tmp++]=A[R++]; } while(L<=LeftEnd) TmpA[Tmp++]=A[L++]; while(R<=RightEnd) TmpA[Tmp++]=A[R++]; // for(int i = 0;i < NumElements ; i++, RightEnd--) // A[RightEnd]=TmpA[RightEnd]; } ////////快速排序//////////////////////////////////////// //核心:选主元 (头,尾,中,三者选中间大小的数字) ElementType Median3(ElementType A[],int Left,int Right) { int Center = (Left + Right) / 2; if(A[Left] > A[Center]) Swap(A[Left] , A[Center]); if(A[Left] > A[Right]) Swap(A[Left] , A[Right]); if(A[Center] > A[Right]) Swap(A[Center] , A[Right]); Swap(A[Center] , A[Right-1]); return A[Right-1]; } /*Left保存最小值,Right保存最大值,Right-1保存中值, 只需要考虑(left+1,Right-2)的排序就好*/ void Quicksort(ElementType A[], int Left, int Right) { int i,j,Pivot; if(Cutoff <= Right-Left) //当排序的数小于Cutoff就用插入排序,因为数量小的时候,快排还不如插入排序; { Pivot = Median3(A,Left,Right); i = Left; j = Right - 1; for(;;) { while(A[++i] < Pivot); while(A[--j] > Pivot); if(i<j) Swap(A[i],A[j]); else break; } Swap(A[i],A[Right-1]); Quicksort(A,Left,i-1); Quicksort(A,i+1,Right); } else Insertion_Sort(A+Left,Right-Left+1); } void Quick_Sort(ElementType A[],int N) { Quicksort(A,0,N-1); }
标签:
原文地址:http://blog.csdn.net/qq_34446253/article/details/51365873