目录
?写一个函数,实现一个整形有序数组的二分查找
?写一个函数,实现一个冒泡排序
因为之前掌握不牢的原因,将二分查找和冒泡排序进行了混淆,总结一下,作为提醒和警戒。?
?写一个函数,实现一个整形有序数组的二分查找
先想好函数怎么用,再去写函数 ? !!!!
去哪里查,查什么,数组有几个元素,找到了怎么办
假设有一个数组int arr[ ] = { 0,1,2,3,4,5,6,7,8,9};
查 k=7 这个数,数组中有sz个元素
约定; ?? ?找到了返回下标 ?? ?找不到返回-1?
图解:
代码如下:
#include <stdio.h>
int binary_search(int arr[], int k, int sz)
{
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (k > arr[mid])
{
left = mid + 1;
}
else if (k < arr[mid])
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
int k = 7;
int ret = binary_search(arr, k, sz);
if (ret == -1)
{
printf("找不到\n");
}
else
{
printf("找到了,下标是%d\n",ret);
}
return 0;
}
?
??下面这个代码也是正确的,但我们一般不在函数中直接打印数据。因为函数的功能要尽量足够单一,高内聚低耦合
#include <stdio.h>
void binary_search(int arr[], int k,int sz)
{
int left = 0;
int right = sz - 1;
while (left<=right)
{
int mid = left + (right - left) / 2;
if (k > arr[mid])
{
left = mid + 1;
}
else if (k < arr[mid])
{
right = mid - 1;
}
else
{
printf("找到了,下标是%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
}
int main()
{
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
binary_search(arr,k,sz);
return 0;
}
?写一个函数,实现一个冒泡排序
冒泡排序的核心思想:
两个相邻的元素进行比较?,如果比较出来的大小不满足我们需要的顺序,就进行交换,来调整顺序。
假设有一个数组int arr[ ] = { 9,8,7,6,5,4,3,2,1,0 };
用冒泡排序的算法将数组中的元素排成升序并打印出来:
?解题思路:
一趟冒泡排序让一个数据来到它最终应该出现的位置上! 那么如果数组中有sz个元素,则需要sz-1趟冒泡排序 第1趟冒泡排序需要sz-1-0次两两相邻比较 第2趟冒泡排序需要sz-1-1次两两相邻比较
第3趟冒泡排序需要sz-1-2次两两相邻比较
?代码和运行结果:
#include <stdio.h>
//冒泡排序
void bubble_sort(int arr[],int sz)
{
//趟数
int i = 0;
for (i = 0; i < sz - 1; i++)
{
//一趟冒泡排序
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
//两两相邻比较
if (arr[j] > arr[j + 1])
{
//交换
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
?
?
|