在顺序表中实现折半查找和简单排序
排序:
#include<stdio.h>
#define n 10
void display(int *a, int n)
{
int i;
for (i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
void selectionsort(int *a, int n)
{
int i, j, index, value;
for (i = 0; i < n - 1; i ++) {
index = i;
value = a[i];
for (j = i + 1; j < n; j ++)
if (value > a[j]) {
index = j;
value = a[j];
}
a[index] = a[i];
a[i] = value;
display(a, n);
}
}
void main()
{
int a[n],i ;
for(i=0;i<n;i++)
a[i]=n-i;
display(a, n);
selectionsort(a, n);
}
折半查找:
int binarysearch(int number)
{
int mid, start = 0, end = Len - 1;
/* 假定a是排好序的 */
/* mustbe(start, end, number),因为a[start..end]就是整个数组a[0..Len-1] */
while (start <= end) {
/* mustbe(start, end, number),因为一开始进入循环时是正确的,每次循环也都维护了这个条件 */
mid = (start + end) / 2;//取a数组中间的值,与number比较
if (a[mid] < number)
/* 如果a数组中间值小于number,那么number一定要在mid后的后半段数组中,所以我们就将mid+1,将这个作为start,number必然在后半段数组a[mid+1,end]中*/
start = mid + 1;
else if (a[mid] > number)
/如果a数组中间值大于number,那么number一定在mid前的前半段数组中,那么应该将mid-1,这个mid-1就是前半段数组的最后一个元素 */
end = mid - 1;
else
/* a[mid] == number,说明找到了 */
return mid;
}
/*
* mustbe(start, end, number)一直被循环维护着,到这里应该仍然成立,在a[start..end]范围之外一定不存在number,
* 但现在a[start..end]是空序列,在这个范围之外的正是整个数组a,因此整个数组a中都不存在number
*/
return -1;
}