快速排序+归并排序

VonGang原创,转载请注明:http://www.cnblogs.com/vongang/

快排过程很简单,就是一个二分的思想,过程如下(从小到大为例):

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;
}

归并排序(好东西来了):

归并操作的过程如下:

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

如图:

实现代码:

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);
}

参考:http://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F

posted @ 2011-08-17 16:12  AC_Von  阅读(334)  评论(0编辑  收藏  举报