分治思想概念
其中会涉及到递归和二分思想,废话不多说,直接上干货
例题一、归并排序
之前也提到了,归并就是把一个大数据分成两组,分别对两组排序然后不断细分直到只剩1个元素时,然后把每每对半分的数据组合并形成有序数组
#include<stdio.h>
void Merge(int a[], int s, int m, int e, int tmp[])
{
int pb = 0;
int p1 = s, p2 = m + 1;
while(p1 <= m && p2 <= e)
{
if(a[p1] < a[p2])
tmp[pb++] = a[p1++];
else
tmp[pb++] = a[p2++];
}
while(p1 <= m)
tmp[pb++] = a[p1++];
while(p2 <= e)
tmp[pb++] = a[p2++];
int i;
for(i = 0; i < e - s + 1; i++)
a[s + i] = tmp[i];
}
void MergeSort(int a[], int s, int e, int tmp[])
{
if(s < e)
{
int m = s + (e - s) / 2;
MergeSort(a, s, m, tmp);
MergeSort(a, m + 1, e, tmp);
Merge(a, s, m, e, tmp);
}
}
int a[10] = {13, 27, 19, 2, 8, 12, 2, 8, 30, 89};
int b[10];
int main()
{
int size = sizeof(a) / sizeof(int); //算出数组a须排序的元素个数
MergeSort(a, 0, size - 1, b);
int i;
for(i = 0; i < size; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
运行结果如下:
例题二、快速排序
比方说对于序列7 1 3 8 12 11 2 9,第一次快排,分析如下
#include<stdio.h>
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void QuickSort(int a[], int s, int e)
{
if(s >= e)
return;
int k = a[s];
int i = s, j = e;
while(i != j)
{
while(j > i && a[j] >= k)
{
--j;
}
swap(&a[i], &a[j]);
while(i < j && a[i] <= k)
{
++i;
}
swap(&a[i], &a[j]);
}
QuickSort(a, s, i - 1);
QuickSort(a, i + 1, e);
}
int main()
{
int a[] = {7, 1, 3, 6, 12, 11, 2, 9};
int size = sizeof(a) / sizeof(int);
QuickSort(a, 0, size - 1);
int i;
for(i = 0; i < size; ++i)
printf("%d, ", a[i]);
printf("\n");
return 0;
}
当然,要注意,快排效率高的情况出现在左右两边数字的数目基本相同的情况下
这里还有一个关于二分查找与快排的结合的题目:找一对数,详情可翻看算法三:二分查找(与快排相结合)