#include
int BinarySearch(int* a,int left,int right,int e)//寻找有序a[n]数组中是否有e元素,若有,返回e的位置;若没有,返回-1
{
while (left <= right)
{
int mid = (left + right) / 2;
if (a[mid] == e) { return mid; }
else if (a[mid] < e) { BinarySearch(a, mid + 1, right, e); }
else if (a[mid] > e) { BinarySearch(a, left, mid -1, e); }
}
return -1;
}
void main()
{
int a[5] = { 3,4,5,6,7 };
int b;
b = BinarySearch(a, 0, 4, 5);
printf("元素5在数组a的第%d位", b+1);
}
在最坏情况下,while循环执行O(logn)次。最坏情况的时间复杂度即为O(logn).
思路:
代码:有点问题,对题目里的数组可以,再换几个例子就会出问题。找不出来问题,以后再改
更新:改出来了!最重要的问题是在第一个while判断里面,两个条件的前后顺序很重要!
#include
void Merge(int* a, int* b, int left, int mid, int right)//将a数组的两块在b数组中排序好
{
int i = left;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= right)
{
if (a[i] < a[j])
{
b[k] = a[i]; k++; i++;
}
if (a[i] > a[j])
{
b[k] = a[j]; k++; j++;
}
if (a[i] == a[j])
{
b[k] = a[i]; k++; i++;
b[k] = a[j]; k++; j++;
}
}
while (i <= mid)
{
b[k] = a[i]; k++; i++;
}
while (j <= right)
{
b[k] = a[j]; k++; j++;
}
}
void Copy(int *a,int*b,int left,int right)//将b数组复制到a数组中
{
int k = 0;
for (int i = left; i <= right; i++)
{
a[i] = b[k]; k++;
}
}
void MergeSort(int* a, int left, int right)
{
int b[10];
if (left < right)
{
int mid = (left + right) / 2;
MergeSort(a, left, mid);
MergeSort(a, mid + 1, right);
Merge(a, b, left, mid, right);
Copy(a, b, left, right);
}
else return;
}
void main()
{
int a[10] = { 24,6,9,1,3,45,4,79};
MergeSort(a, 0, 7);
for (int i = 0; i <= 7; i++)
{
printf("%d ", a[i]);
}
}
#include
void Swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
int Partition(int* a, int p, int r)
{
int i = p;
int j = r + 1;
int x = a[p];
//将比x小的元素交换到左边,大的到右边
while (true)
{
while (a[++i] < x && i < r);
while (a[--j] > x);
if (i >= j)break;
Swap(a[i], a[j]);
}
a[p] = a[j];
a[j] = x;
return j;
}
void QuickSort(int* a, int p, int r)//排序从a[p]到a[r]
{
if (p < r)
{
int q = Partition(a, p, r);
QuickSort(a, p, q - 1);
QuickSort(a, q + 1, r);
}
}
void main()
{
int a[10] = { 5,33,9,11,7,6 };
QuickSort(a, 0, 5);
for (int i = 0; i <= 5; i++)
{
printf("%d ", a[i]);
}
}
这个代码也有点问题,例中的数组可以用,换个数据就不能用了。改不出来为啥有问题,先摆了。以后再回来看。哎。。。
后来改出来了但是懒得找了hhh