快速排序+归并排序
快排过程很简单,就是一个二分的思想,过程如下(从小到大为例):
1、取一个关键字;
2、把序列中大于关键字的放在关键字右边;
3、把序列中小于关键字的放在关键字左边;
4、重复1-3步,直到序列有序;
代码+注释:
#include<stdio.h> #define N 100 int QuickSort1 (int r[], int low, int high) { int key; key=r[low]; /*取轴值记录关键字*/ while(low<high) /*从表的两端交替地向中间扫描*/ { while(low<high && r[high]>=key)high--; r[low]=r[high]; /*将比轴值记录小的交换到低端*/ while (low<high && r[low]<=key) low++; r[high]=r[low]; /*将比轴值记录大的交换到高端*/ } r[low]=key; /*轴值(支点)记录到位*/ return low; /*返回轴值(支点)记录所在位置*/ } void QuickSort(int r[],int low,int high) { /*对顺序表S中的子序列r[low…high]作快速排序*/ int k; if(low<high) { k= QuickSort1 (r,low,high); /*将待排序序列一分为二*/ QuickSort (r,low,k-1); /*对小于轴值序列实现递归排序*/ QuickSort (r,k+1,high); /*对大于轴值序列实现递归排序*/ } } int main() { int a[N],n; scanf("%d",&n);//输入元素个数 for(int i = 0; i < n; i++) { scanf("%d",a+i); } QuickSort(a,0,n-1); for(int i = 0; i < n; i++) { printf("%d ",a[i]); } putchar('\n'); return 0; }
归并排序(好东西来了):
归并操作的过程如下:
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤3直到某一指针达到序列尾
- 将另一序列剩下的所有元素直接复制到合并序列
如图:
实现代码:
void merge(int array[], int low, int mid, int high) { int i, k; int *temp = (int *) malloc((high-low+1) * sizeof(int)); //申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 int begin1 = low; int end1 = mid; int begin2 = mid + 1; int end2 = high; for (k = 0; begin1 <= end1 && begin2 <= end2; ++k) //比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 if(array[begin1]<=array[begin2]) temp[k] = array[begin1++]; else temp[k] = array[begin2++]; if(begin1 <= end1) //若第一个序列有剩余,直接拷贝出来粘到合并序列尾 memcpy(temp+k, array+begin1, (end1-begin1+1)*sizeof(int)); if(begin2 <= end2) //若第二个序列有剩余,直接拷贝出来粘到合并序列尾 memcpy(temp+k, array+begin2, (end2-begin2+1)*sizeof(int)); memcpy(array+low, temp, (high-low+1)*sizeof(int));//将排序好的序列拷贝回数组中 free(temp); }
ps:转自http://www.cnblogs.com/vongang/