合并排序实验报告总结 合并排序c语言算法代码( 五 )


void quickSort(int a[], int low, int high){ if(low < high){ int privotLoc = partition(a, low, high); //将表一分为二 quickSort(a, low, privotLoc -1); //递归对低子表递归排序 quickSort(a, privotLoc1, high); //递归对高子表递归排序 }}
int main{ int a[10] = {3,1,5,7,2,4,9,6,10,8}; cout<<"初始值:"; print(a,10); quickSort(a,0,9); cout<<"结果:"; print(a,10);
}七、归并排序(Merge Sort)
算法思想:
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法 。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用 。
算法步骤:

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置;
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
  4. 重复步骤3直到某一指针达到序列尾;
  5. 将另一序列剩下的所有元素直接复制到合并序列尾 。
算法代码:

void print(int a[], int n){ for(int j= 0; j cout< } cout<}
//将r[i…m]和r[m1 …n]归并到辅助数组rf[i…n]void Merge(ElemType *r,ElemType *rf, int i, int m, int n){ int j,k; for(j=m 1,k=i; i<=m && j <=n ;k){ if(r[j] < r[i]) rf[k] = r[j]; else rf[k] = r[i]; } while(i <= m) rf[k] = r[i]; while(j <= n) rf[k] = r[j]; print(rf,n 1);}
void MergeSort(ElemType *r, ElemType *rf, int lenght){ int len = 1; ElemType *q = r ; ElemType *tmp ; while(len < lenght) { int s = len; len = 2 * s ; int i = 0; while(ilen Merge(q, rf, i, is-1, ilen-1 ); //对等长的两个子表合并 i = ilen; } if(is < lenght){ Merge(q, rf, i, is -1, lenght -1); //对不等长的两个子表合并 } tmp = q; q = rf; rf = tmp; //交换q,rf,以保证下一趟归并时,仍从q 归并到rf }}
int main{ int a[10] = {3,1,5,7,2,4,9,6,10,8}; int b[10]; MergeSort(a, b, 10); print(b,10); cout<<"结果:"; print(a,10);}八、基数排序(Radix Sort)
算法思想:
基数排序:通过序列中各个元素的值,对排序的N个元素进行若干趟的“分配”与“收集”来实现排序 。
分配:我们将L[i]中的元素取出,首先确定其个位上的数字,根据该数字分配到与之序号相同的桶中。
收集:当序列中所有的元素都分配到对应的桶中,再按照顺序依次将桶中的元素收集形成新的一个待排序列L。
对新形成的序列L重复执行分配和收集元素中的十位、百位…直到分配完该序列中的最高位,则排序结束 。
算法代码:
d RadixSort(Node L[],length,maxradix){ int m,n,k,lsp; k=1;m=1; int temp[10][length-1]; Empty(temp); //清空临时空间 while(k { for(int i=0;i { if(L[i] Temp[0][n]=L[i]; else Lsp=(L[i]/m); //确定关键字 Temp[lsp][n]=L[i]; n; } CollectElement(L,Temp); //收集

推荐阅读