//快速排序加二分查找
//快速排序思想:
//1.取中间数 ,头尾指针元素与其相比较
//2.如果*head < middle head指针继续往后移动 , *head >= middle 时停止
// 如果*tail > middle tail指针继续往前移动 , *tail <= middle 时停止
//3.交换头尾指针指向的元素 , 注意:指针所指位置不变
//4.头尾指针继续移动比较, 直到head > = tail
//二分查找:与前一个不同的是,这里的二分查找传递的是地址,但操作没什么变化
//09.8.9
#include <iostream>
using namespace std;
//分段函数,将待排序序列分成两段,前一段的各个数比后一段的任何一个数都小
int *split (int *head , int *tail)
{
int middle = *(head + (tail - head) / 2);
while (1)
{
while (*head < middle)
head++;
tail--;
while (*tail > middle)
tail--;
if (head >= tail)
return head;
swap (*head , *tail);
head++;
}
}
//快速排序 , 递归调用
void QuickSort(int * first , int *last)
{
if (last > first+1)
{
int *t=split(first, last);
if (last -t < t - first)
{
QuickSort(first , t);
QuickSort(t, last);
}
else
{
QuickSort(first , t);
QuickSort(t, last);
}
}
}
//二分查找
int BinarySearch (int a[] , int *head , int *tail , int x)
{
if (head > tail)
return false;
else
{
int *middle = head + (tail - head) / 2;
if (x > *middle)
BinarySearch (a, middle + 1, tail, x);
else if (x < *middle)
BinarySearch (a, head, middle - 1, x);
else
return middle - a + 1;
}
}