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;
}
归并排序(好东西来了):
归并操作的过程如下:
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤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);
}
参考:http://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F