排序
来源:互联网 发布:网络结构七层 编辑:程序博客网 时间:2024/06/06 09:31
1.冒泡排序
void Bubble_Sort(ElementType A[], int N) { for(P=N-1;P>=0;P--) { flag = 0; for(i=0;i<P;i++) { if(A[i] > A[i+1]) { Swap(A[i], A[i+1]); flag = 1; } } if(flag == 0) break; }}
2.插入排序
void Insertion_Sort(ElementType A[], int N){ for(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; }}
3.希尔排序
void Shell_Sort(ElementType A[], int N){ for(D=N/2;D>0;D/=2) { for(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; } }}/* D可以取别的数: Hibbard增量序列:Dk = 2^k-1 Sedgewick增量序列:9x4^i-9x2^i+1*/
4.堆排序
/* MaxSort(ElementType A[], int i, int N) 对A数组从i到0结点进行创建堆操作,N为A元素的个数*/void Heap_Sort(ElementType A[], int N){ for(i=N/2-1;i>=0;i--) MaxSort(A,i,N); for(i=N-1;i>0;i--) { Swap(&A[0],&A[i]); MaxSort(A,0,i); }}
5.归并排序
递归算法:void Merge_Sort(ElementType A[],int N){ ElementType *TmpA; TmpA = malloc(N*sizeof(ElementType)); if(TmpA != NULL) { MSort(A,TmpA,0,N-1); free(TmpA); } else ERROR;}void MSort(ElementType A[],ElementType TmpA[], int L, int Rend){ int center; if(L<Rend) { center = (L+Rend)/2; Msort(A,TmpA,L,center); Msort(A,TmpA,center+1,Rend); Merge(A,TmpA,L,center+1,Rend); }}void Merge(ElementType A[],ElementType TmpA[],int L,int R, int Rend){ // L是A左半起始元素,R是右半起始元素,Rend是右边结束 Lend = R-1; Tmp = L; NumElements = Rend -L +1; while(L<=Lend && R<=Rend) { if(A[L] <= A[R]) TmpA[Tmp++] = A[L++]; else TmpA[Tmp++] = A[R++]; } while(L<=Lend) TmpA[Tmp++] = A[L++]; while(L<=Rend) TmpA[Tmp++] = A[R++]; for(i=0;i<NumElements;i++,Rend--) A[Rend] = TmpA[Rend];}非递归算法:void Merge_Sort(ElementType A[], int N){ ElementType *TmpA; int length = 1; TmpA = malloc(N*sizeof(ElementType)); if(TmpA!=NULL) { while(length<n) { Merge_Pass(a, tema, n, length); length *= 2; Merge_Pass(tema, a, n, length); length *= 2; } free(TmpA); } else ERROR;}void Merge_Pass(ElementType A[], ElementType TmpA[], int N, int length){ for(i=0;i<=N-2*length;i+=length*2) Merge1(A, TmpA, i, i+length, i+2*length-1); if(i+length<n) Merge1(A, TmpA, i, i+length, n-1); else { int j; for(j=i;j<n;j++) { TmpA[j] = A[j]; } }}void Merge1(ElementType A[],ElementType TmpA[],int L,int R, int Rend){ // L是A左半起始元素,R是右半起始元素,Rend是右边结束 Lend = R-1; Tmp = L; while(L<=Lend && R<=Rend) { if(A[L] <= A[R]) TmpA[Tmp++] = A[L++]; else TmpA[Tmp++] = A[R++]; } while(L<=Lend) TmpA[Tmp++] = A[L++]; while(L<=Rend) TmpA[Tmp++] = A[R++];}
6.快速排序
//当数据规模较小时还不如用插入排序,因为快速排序是递归算法void Quick_Sort(ElementType A[], int N){ QucikSort(A,0,N-1);}void QuickSort(ElementType A[], int Left, int Right){ int cutoff = 100; if(cutoff<=Right-Left) { 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);}// 选取头、中、尾的中位数作为主元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];}
7.基数排序
N个学生,成绩[0,100]即M=101,对学生按成绩排序void Bucker_Sort(ElementType A[], int N){ count[] 初始化; //count是每个成绩的链表头结点 while(读入一个学生成绩score) 学生插入count[score]链表; for(i=0;i<M;i++) { if(count[i]) 输出整个链表; }}
表排序
形成一个环,环,环,…..