二分法排序:
void Start()
{
int[] tempArrayList = new int[11]{3,4,7,3,2,1,11,9,6,1,121};
HalfSort(tempArrayList);
for(int i = 0;i < tempArrayList.Length;i ++)
{
Debug.Log(tempArrayList[i]);
}
}
public void HalfSort(int[] _array)
{
for(int i = 0;i < _array.Length;i++)
{
int tempStartIndex = 0;
//index(i)跟index[0-(i-1)]之前的数组元素比较
int tempEndIndex = i - 1;
int tempMiddleIndex;
int tempCurrentValue = _array[i];
int tempMiddleValue;
while(tempStartIndex <= tempEndIndex)
{
//index(0-(i-1)) 中间的元素
tempMiddleIndex = (tempStartIndex + tempEndIndex)/2;
tempMiddleValue = _array[tempMiddleIndex];
//index(0-(i-1)) 中间的元素值比index(i)位置的元素值大,说明
//index(tempMiddleIndex-tempEndIndex)的元素值比 index(i)元素值大
//结束index直接从tempEndIndex跳到中间元素index(tempMiddleIndex)之前
//if(tempCurrentValue > tempMiddleValue) 降序
if(tempMiddleValue > tempCurrentValue)
{
tempEndIndex = tempMiddleIndex-1;
}else
{
//index(0-(i-1)) 中间的元素值比index(i)位置的元素值小,说明
//index(tempStartIndex-tempMiddleIndex)的元素值比 index(i)元素值小
//开始index直接从tempStartIndex跳到中间元素index(tempMiddleIndex)之后
tempStartIndex = tempMiddleIndex+1;
}
//Debug.Log(tempStartIndex + "_" + tempEndIndex);
}
//当前要排序index(i) = 7,如果插入位置为7之前,比如index(4-5)之间(结束while排序时tempEndIndex = 4)
//将index(5-6)往后移动1个位置,覆盖当前要排序的index(7),空出index(5),然后index(5) = tempCurrentValue
for(int j = i-1;j > tempEndIndex;j--)
{
_array[j+1] = _array[j];
}
//例如:插入位置为index(4-5)中间,
//(4+5)/2 = 4 tempCurrentValue > tempMiddleValue; 4 = tempEndIndex = tempMiddleIndex-1;
//(5+5)/2 = 5 tempCurrentValue < tempMiddleValue; 5 = tempStartIndex = tempMiddleIndex+1;
// tempStartIndex > tempEndIndex while结束
_array[tempStartIndex] = tempCurrentValue;
}
}
运行结果:
二分法查找:
二分法查找必要条件是数据必须排好序的。
void Start()
{
int[] tempArrayList = new int[11]{1,1,2,3,3,4,6,7,9,11,121};
int tempIndex = SearchSort(tempArrayList,7,0,tempArrayList.Length-1);
if(tempArrayList[tempIndex] == 7)
{
Debug.Log("查找value = 7 index = " + tempIndex + " 查找成功");
}
}
public int SearchSort(int[] _array,int _value,int _startIndex,int _endIndex)
{
if(_startIndex > _endIndex)
{
return - 1;
}
int tempMiddleIndex = (_startIndex + _endIndex)/2;
int tempMiddleValue = _array[tempMiddleIndex];
//中间位置正好是要查找值,返回index
if(tempMiddleValue == _value)
{
return tempMiddleIndex;
}
//tempMiddleValue > _value 说明index(tempMiddleIndex-_endIndex)区间的都大于_value,最大查找index改为 = tempMiddleIndex - 1)
if(tempMiddleValue > _value)
{
return SearchSort(_array,_value,_startIndex,tempMiddleIndex - 1);
}else
{
return SearchSort(_array,_value,tempMiddleIndex+1,_endIndex);
}
}
参考:
https://blog.csdn.net/yysyangyangyangshan/article/details/7399645