您的位置:首页 > 其它

二分查找,快速排序,归并排序

2018-03-25 22:00 295 查看
1. 二分查找的递归版本。int BinarySearchRecur(vector<int> &v1, int searchNum, int sIdx, int eIdx)
{
int ret = -1;
int midIdx = sIdx + ( (eIdx - sIdx) >> 1 );

if (sIdx <= eIdx) // 一定要加上,不然如果找不到就会陷入死循环。
{
if (v1[midIdx] < searchNum)
{
ret = BinarySearchRecur(v1, searchNum, midIdx+1, eIdx);
}
else if(v1[midIdx] > searchNum)
{
ret = BinarySearchRecur(v1, searchNum, sIdx, midIdx -1 );
}
else
ret = midIdx;
}

return ret;
}
2. 二分查找非递归。int BinarySearch(vector<int> &v1, int searchNum)
{
int sIdx = 0, eIdx = v1.size()-1;

while (sIdx <= eIdx)
{
int midIdx = sIdx + ( (eIdx - sIdx) >> 1 );

if (v1[midIdx] > searchNum)
eIdx = midIdx - 1;
else if (v1[midIdx] < searchNum)
sIdx = midIdx + 1;
else
return midIdx;
}

return -1;
}3. 快速排序。template<typename T>
void Swap(T *a, T *b)
{
T tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
template<typename T, typename U>
U Partition(T * arr, U sIdx, U eIdx)
{
if (arr==nullptr || sIdx<0 )
{
cout << "Error occurred in Partition.";
return -1;
}

T  pivot = arr[sIdx], tmp;
U ii = sIdx, jj = sIdx+1;

for (; jj<=eIdx; ++jj)
{
if (arr[jj] < pivot)
{
++ii;
Swap(&arr[ii], &arr[jj]);
}
}

Swap(&arr[sIdx], &arr[ii]);

return ii;
}
template int Partition(float * arr, int sIdx, int eIdx);
template<typename T, typename U>
void QuickSort(T * arr, U len, U sIdx, U eIdx)
{
if (arr==nullptr || len<=0 || sIdx<0 || eIdx>=len)
{
printf ("error");
return ;
}

U midIdx = (sIdx + eIdx) / 2;
if(sIdx < midIdx)
{
midIdx = Partition(arr, sIdx, eIdx);
QuickSort(arr, len, sIdx, midIdx);
QuickSort(arr, len, midIdx+1, eIdx);  //arr所有的元素都已经被放到了指定的位置,所以不需要有递归的终止条件。
}
}
template void QuickSort(float * arr, int len, int sIdx, int eIdx);
4. 归并排序。template<typename T, typename X>
void Merge(T* arr, X sIdx, X midIdx, X eIdx)
{
T *tmp = new T[eIdx-sIdx+1];

X ii = sIdx, jj = midIdx + 1, kk = 0;
while (ii != midIdx+1 && jj != eIdx+1)
{
if(arr[ii] > arr[jj])
{
tmp[kk++] = arr[jj++];
}
else
{
tmp[kk++] = arr[ii++];
}
}

while (ii != midIdx + 1)
tmp[kk++] = arr[ii++];
while (jj != eIdx + 1)
tmp[kk++] = arr[jj++];

for (X ii=0; ii<kk; ++ii)
arr[ii+sIdx] = tmp[ii];

delete [] tmp;

}
void Merge(float* arr, int sIdx, int midIdx, int eIdx);
template<typename T, typename X>
void MergeSort(T* arr, X len, X sIdx, X eIdx)
{
if (arr == nullptr ||len<=0 || sIdx<0 || eIdx>=len)
{
cout << "Invalid input.";
return ;
}

X midIdx = (sIdx + eIdx) / 2;
if (sIdx < eIdx)
{
MergeSort(arr, len, sIdx, midIdx);
MergeSort(arr, len, midIdx+1, eIdx);
Merge(arr, sIdx, midIdx, eIdx);
}
}
void MergeSort(float* arr, int len, int sIdx, int eIdx);
附上:常见排序算法动图
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐