以结构体数组的话是流程是这么分析的
程序代码:
//核心处理函数存在问题,似乎while循环最多执行一次,稍改一下
#include "stdio.h"
#include "malloc.h"
#define TRUE 1
typedef int Keyelem;
typedef struct {
Keyelem key;
int length;//如果是结构体包数组,可以留,但是结构体只是单个元素统计表意不明。
}SortedSeq;
int times=0;
/**
* 查找实现方法
* array 数组对象
* start 查找范围开始端索引
* end 查找范围结束端索引
*/
int binarySearchSub(SortedSeq array[], int start, int end, int value) {
times++;
if (start > end) {
return -1;
}
int mid = (start+end)/2;
int compare_result = array[mid].key - value;
if (compare_result > 0){
end = mid + 1;
return binarySearchSub(array, start, end, value);
} else if(compare_result < 0){
start = mid - 1;
return binarySearchSub(array, start, end, value);
} else {
return mid;
}
}
/**
* 二分法排序入口
* array 被查找数组
* len 数组长度
* value 被查找元素
*/
int binarySearch(SortedSeq array[], int len, int value) {
return binarySearchSub(array, 0, len - 1, value);
}
/**
* 自定义比较器
* 按key值升序
*/
int compare(SortedSeq ele1, SortedSeq ele2){
return ele1.key-ele2.key;
}
/**
* 排序方法
* array 待排序数组
* n 数组长度
*/
void sort(SortedSeq array[], int n){
int i,j;
for(i = 0; i < n; i++){
for(j = 0; i + j < n - 1; j++){
if(compare(array[j], array[j + 1])>0) {
SortedSeq temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
/**
* 遍历数组并输出key属性
* array 数组对象
*/
void display(SortedSeq array[], int n){
for(int i = 0; i < n; i++) {
printf("%d ",array[i].key);
}
printf("\n");
}
int main()
{
/** preparation work */
int key_arrs[]={11,12,13,14,15,16,17,18,19};
int n=sizeof(key_arrs)/sizeof(key_arrs[0]);
SortedSeq seqs[n];
for (int i = 0; i < n; i++) {
seqs[i].key = key_arrs[i];
}
display(seqs, n);
sort(seqs, n);
display(seqs, n);
int found_index = binarySearch(seqs, n, 17);
/** main函数的输出为这些 */
printf("二分查找的查找位置为: %d\n", found_index);
printf("二分查找的次数为: %d", times);
}