在校招笔试时曾看见一道题目比较综合的、关于排序和二分查找的编程题,从动态分配数组到使用快速排序对数组进行排序再到使用二分法查找给定数字,到最后释放数组内存。感觉全方面考察了创建数组、排序、查找的相关知识点,遂记录下来。
题目:用C编写一段代码,实现以下功能
1.输入一个正整数n(n<=100)
2.动态分配一个长度为n的整形数组,并输入数组元素
3.使用快速排序算法对数组进行升序排序,并输出排序后的数组
4.使用二分法查找算法在数组中查找一个给定的整数x,并输出查找结果释放数组占用的内存
首先我们需要注意的是在实现数组中数值交换函数时一定要采取传址调用的方法。
C/C++中关于交换(Swap)函数的三种方法_c++ swap_立志学好编程的小白的博客-CSDN博客
在这里我编写了一个swap函数用作交换函数,方便快捷。然后编写了一个打印数组的函数PrintArray方便输出数组中的数值。
//交换函数
void swap(int* x,int* y)
{
int temp = *x;
*x = *y;
*y = temp;
}
//打印数组
void PrintArray(int* arr, int nums)
{
for(int i = 0; i < nums; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
关于快速排序的原理可以参考这篇文章快速排序(快排) (C语言实现)_快速排序c语言_Brant_zero2022的博客-CSDN博客
代码部分
void QuickSort(int* a, int begin, int end)
{
if (begin >= end)
{
return;
}
int left = begin;
int right = end;
int key = left;
while (left < right)
{
while (left < right && a[key] <= a[right])
{
right--;
}
while (left < right && a[left] <= a[key])
{
left++;
}
swap(&a[left], &a[right]);
}
swap(&(a[key]), &(a[right]));
key = right;
QuickSort(a, begin, key - 1);
QuickSort(a, key + 1, end);
}
关于二分法的原理也比较简单可以参考这篇文章【C语言】二分查找(含图解)_二分查找c语言-CSDN博客
代码部分
void BinarySearch(int* arr, int arrlen, int target)
{
int left = 0;
int right = arrlen - 1;
while(left <= right)
{
//mid要在循环中定义,每次循环过后mid值会发生变化,缩小范围继续循环
int mid = (left + right)/2;
if(arr[mid] > target)
{
right = mid - 1;
}
else if(arr[mid] < target)
{
left = mid + 1;
}
else
{
//输出x在数组的第几位,+1与否看题目而定,若数字位置从0开始算起则不用+1
printf("x is in bit %d of the array\n", mid + 1);
break;
}
}
if(left > right)
{
/*若不是通过找到x位置才跳出while循环则说明数组中根本没有x元素,
此时left已经大于right进入此条件*/
printf("There is no x !!!");
}
}
对于数组的动态分配采用了malloc函数,需要注意使用此函数时需要引用头文件#include<stdlib.h>,以下是包括主函数在内的整体代码:
#include<stdio.h>
#include<stdlib.h>
//交换函数
void swap(int* x,int* y)
{
int temp = *x;
*x = *y;
*y = temp;
}
//打印数组函数
void PrintArray(int* arr, int nums)
{
for(int i = 0; i < nums; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
//快速排序函数
void QuickSort(int* arr, int begin, int end)
{
if (begin >= end)
{
return;
}
int left = begin;
int right = end;
int key = left;
while (left < right)
{
while (left < right && arr[key] <= arr[right])
{
right--;
}
while (left < right && arr[left] <= arr[key])
{
left++;
}
swap(&arr[left], &arr[right]);
}
swap(&(arr[key]), &(arr[right]));
key = right;
QuickSort(arr, begin, key - 1);
QuickSort(arr, key + 1, end);
}
//二分法查找函数
void BinarySearch(int* arr, int arrlen, int target)
{
int left = 0;
int right = arrlen - 1;
while(left <= right)
{
int mid = (left + right)/2;
if(arr[mid] > target)
{
right = mid - 1;
}
else if(arr[mid] < target)
{
left = mid + 1;
}
else
{
printf("x is in bit %d of the array\n", mid + 1);
break;
}
}
if(left > right)
{
printf("There is no x !!!");
}
}
//主函数
int main()
{
//n为数组大小, x为要查找的数字
int n,x;
printf("please input n = ");
scanf("%d", &n);
//动态分配大小为n的数组
int *a = (int*)malloc(sizeof(int) * n);
//依次输入数组中的数值,每次用回车确定
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
printf("please input x = ");
scanf("%d", &x);
//打印原来数组
printf("befor array a = ");
PrintArray(a, n);
//打印排序后数组
QuickSort(a, 0, n-1);
printf("after array a = ");
PrintArray(a, n);
//二分法查找并输出结果
BinarySearch(a, n, x);
free(a);
return 0;
}
如果有错误或疏忽的地方欢迎大家评论区批评指正,感谢大家的关注,我会持续更新嵌入式软件和基础算法的一些内容。