二分查找
二分查找是通过创建中间值将待查找的区间分成两部分并只取一部分继续查找。
#include<stdio.h>
int main()
{
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
int k = 8;//要查找的数
int sz = sizeof(arr) / sizeof(arr[0]);//sz是元素个数
int zuo = 0;//左下标
int you = sz - 1;//右下标就是元素个数-1
while (zuo <= you)
{
int min = (zuo + you) / 2;//min是中间元素
if (arr[min]> k)//中间元素大于要找的数
{
you = min -1;//改变右下标
}
else if (arr[min]<k)//中间元素小于找的数
{
zuo = min + 1;//改变左下标
}
else//这里就是中间元素等于要找的数了
{
printf("%d\n", min);
break;
}
}
if (zuo > you)
{
printf("找不到\n");
}
}
冒泡排序
冒泡排序是对于一组要排序的元素列,从第一个元素开始依次比较相邻的两个数,将较小的数放到前面,大的数放到后面,直到比较到最后两个数,小数放前,大数放后,一趟后元素中最大的数就会在最后,重复步骤,直至排序完成。
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
int arr[10] = { 3,5,6,8,9,1,4,2,7,0};
int sz = sizeof(arr)/sizeof(arr[0]);//sz是元素个数
int biaoz = 0;//标记
for (i = 0; i < sz - 1; i++)//外层循环,sz-1是表示要计较多少趟
{
for (j = 0; j < sz-1 - i; j++)//比较完一趟就会少一个数所以-i
{
if (arr[j] > arr[j + 1])//比较两个数,左边比右边大就交换
{
int a = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = a;
biaoz = 1;//进行了交换,不是有序的biaoz设置为1
}
}
if (biaoz == 0;)//没有发生交换,break跳出循环
{
break;
}
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
选择排序
选择排序是从待排序的元素中选出最小或者最大的一个元素放到序列的最起始位置,然后从剩余的元素中找到最小或最大的元素继续放在起始位置。
#include<stdio.h>
int main()
{
int arr[] = { 4,3,8,9,0,1,2,6,7,5 };
int i = 0;
int j = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
for (j =i+1;j<sz;j++)
{
if (arr[i] > arr[j])
{
int a = arr[i];
arr[i] = arr[j];
arr[j] = a;
}
}
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
插入排序
#include<stdio.h>
int main()
{
int arr[] = { 3,5,1,9,0,6,4,2,7,8 };
int i = 0;
int j = 0;
int z = 0;
for (i = 1; i < 10; i++)
{
z = arr[i];
for (j = i - 1; j >= 0 && arr[j] > z; j--)
{
arr[j + 1] = arr[j];
arr[j] = z;
}
}
for (i = 0; i < 10; i++)
{
printf("%d ",arr[i]);
}
}