C语言实战——在无序数组中查找指定值

        首先,在数组中查找指定值,首先想到的就是折半查找法(二分法),但在折半法中,要求数组必须是有序的,所以可以先将数组内的数据进行相关的排序工作后,再运用二分法查找。

int BinarySearch(int* array,int size,int value);//折半查找
int BubbleSort(int* array,int* size,int is_desc);//冒泡排序

        所以,最终决定先采用冒泡排序(BubbleSort)的方法将数组列为有序的,再用折半查找(BinarySrarch),查找到指定元素。

冒泡排序

       冒泡排序就是把小的元素往前调或者把大的元素往后 调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

      冒泡排序的思想(升序排序):每次循环找出一个待排序区间中的最大值,安放在合适的位置上,循环N次就能够把N个值都放好,最终保数组是有序的。

int BubbleSort(int* array,int* size,int Is_Desc){
    //在函数的定义中,数组会影视转换为指针,指向数组的首元素
    //数组的长度可以用size = sizeof(arr) / size(arr[0])
    //Is_Desc是用来判定是升序排列还是降序排列
    int bound = 0;
    //[0,bound):已经排好序的区间
    //[bound,size]:待排序的区间
    for(;bound < size;++bound){
        //这个循环执行一次之后,就找出了当前待排区间的最小/大值,并放到了首位
        for(int cur = size - 1;cue > bound;--cur){
            //cur是后面的元素,cur - 1是前面的元素
            //此时就需要进行升序排序,如果发现后面的元素比前面的元素小,就交换两个元素的值
            if(Is_Desc == 0){
                //升序排序
                if(array[cur - 1] > array[cur]){
                    //进行交换
                    Swap(&arr[cur],&arr[cur - 1]);
                }
            }else if(Is_Desc == 1){
                //降序排序
                if(arr[cur] < arr[cur -1]){
                    Swap(&array[cur],&array[cur - 1]);
                }
            }
        }
    }
    return;
}

折半查找

int BinarySearch(int* array, int size, int value) {
	int left = 0;
	int right = size - 1;
	int mid = 0;
	while (left <= right) {
		mid = (right + left) / 2;
		if (array[mid] < value) {
			left = mid + 1;
		}
		else if (array[mid] > value) {
			right = mid - 1;
		}
		else {
			break;
		}
	}
	if (left <= right) {
		printf("Find it!The Num is %d!\n", mid);
	}
	else {
		printf("Can't find it!\n");
	}
	return 1;
}

最终程序

#include
#include

void Swap(int* a,int* b ) {
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int BubbleSort(int* array, int size,int Is_Desc) {
	int bound = 0;
	for (; bound < size; ++bound) {
		for (int cur = size - 1; cur > bound;--cur) {
			if (Is_Desc == 0) {
				if (array[cur] < array[cur - 1]) {
					Swap(&array[cur],&array[cur - 1]);
				}
			}
			else if (Is_Desc == 1) {
				if (array[cur - 1] < array[cur]) {
					Swap(&array[cur], &array[cur - 1]);
				}
			}
		}
	}
	return;
}
int BinarySearch(int* array, int size, int value) {
	int left = 0;
	int right = size - 1;
	int mid = 0;
	while (left <= right) {
		mid = (right + left) / 2;
		if (array[mid] < value) {
			left = mid + 1;
		}
		else if (array[mid] > value) {
			right = mid - 1;
		}
		else {
			break;
		}
	}
	if (left <= right) {
		printf("Find it!The Num is %d!\n", mid);
	}
	else {
		printf("Can't find it!\n");
	}
	return 1;
}
int main()
{
	int arr[] = {98,65,12,33,54,13,38,1,100,20};
	int size = sizeof(arr) / sizeof(arr[0]);
	int value = 13;
	BubbleSort(arr, size, 0);
	BinarySearch(arr,size,value);
    system("pause");
    return 0;   
}

程序运行结果

C语言实战——在无序数组中查找指定值_第1张图片

你可能感兴趣的:(【C/C++】)