//剑指Offer第三题
//哈工大周兴
//联系:qq960020310
#include <iostream>
using namespace std;
/*
//插入排序
bool insertSort(int *a,int len)
{
if (a==nullptr)
{
return false;
}
for (int i=0;i<len;i++)
{
for (int j = 0;j <i;j++)
{
if (j==0 && a[i]<a[j])
{
int temp = a[j];
a[j] = a[i];
a[i] = temp;
break;
}
if (j>=0 && j<i-1)
{
if (a[i]>=a[j] && a[i]<a[j+1])
{
int temp = a[i];
for (int k=i;k>j+1;k--)
{
a[k] = a[k - 1];
}
a[j + 1] = temp;
break;
}
}
}
}
return true;
}
bool findNumber(int a[], int len)
{
if (a==nullptr)
{
return false;
}
int i = 0;
while (i<len-1)
{
int k=i;
if (a[i]==a[i+1])
{
int count = 2;
k = i+1;
while (k+1<len && a[k]==a[k+1])
{
count++;
k++;
}
printf("数字%d重复了%d次!", a[i], count);
}
i = k;
i++;
}
return true;
}
*/
/*
bool duplicate(int numbers[], int length, int *duplication)
{
int count = 0;
if (numbers==nullptr ||length<0)
{
return false;
}
for (int i=0;i<length;i++)
{
if (numbers[i]<0 || numbers[i]>length-1)
{
return false;
}
}
for (int i=0;i<length;i++)
{
while (numbers[i]!=i)
{
if (numbers[i]==numbers[numbers[i]])
{
*duplication = numbers[i];
return true;
}
int temp = numbers[i];
numbers[i] = numbers[temp];
numbers[temp] = temp;
cout << count++ << endl;
}
}
return false;
}
*/
//类似二分查找,不修改原数组
int getDuplication(const int number[], int length)
{
if (number==nullptr || length<=0)
{
return -1;
}
int head = 1;
int rear = length - 1;
int div = (length-1)>>1;
cout << "head= " << head << endl;
cout << "rear= " << rear << endl;
cout << "div= " << div << endl;
while (!(div==head && div==rear))
{
cout << "进来了!" << endl;
int upDiv = 0;
int downDiv = 0;
for (int i=0;i<length;i++)
{
if (number[i]>div && number[i]<=rear)
{
upDiv++;
}
if (number[i]>=head && number[i]<=div)
{
downDiv++;
}
}
cout << "updiv: " << upDiv << endl;
cout << "downdiv: " << downDiv << endl;
if (downDiv>(div-head+1))
{
rear = div;
div = (div+head)>>1;
}
else
{
head = div + 1;
div = (div + 1 + rear) >>1;
}
}
return div;
}
int main(void)
{
int a[9] = {1,4,3,5,3,4,6,4,2};
int dup=getDuplication(a, 9);
cout << dup << endl;
system("pause");
return 0;
}