二分查找,快速排序,归并排序
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;
}
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);
{
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);附上:常见排序算法动图
相关文章推荐
- 二分查找,快速排序,归并排序
- 归并排序、快速排序
- C++实现几种常用的时间复杂度为O(nlogn)的排序方法:归并排序、快速排序、堆排序、希尔排序
- 直通BAT-排序1(冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序)
- java排序之快速排序、归并排序、基数排序
- 快速排序,堆排序和归并排序谁更快?
- 常用的较优排序之快速排序,堆排序,归并排序
- 插入排序,快速排序,堆排序,归并排序
- 三种排序算法(归并排序、快速排序,堆排序)
- Java常见排序:冒泡排序、快速排序、选择排序、插入排序、归并排序
- 快速排序和归并排序
- 快速排序,归并排序
- 排序总结:堆排序、快速排序、归并排序、基数排序
- 【Java】快速排序、归并排序、堆排序、基数排序实现总结
- 八大排序算法:简单插入排序、冒泡排序、希尔排序、快速排序、堆排序、归并排序等总结。
- C++实现冒泡排序,选择排序,插入排序,快速排序,归并排序
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
- 归并排序快速排序java代码
- 排序总结:插入(简单和改进)、希尔、选择、冒泡、快速、堆排序、归并排序
- 快速排序 归并排序的非递归版本 备忘