目录
1.选择排序
2.冒泡排序
3.插入排序
4.查找
4.1 二分查找
1.选择排序
思想:给合适的位置选择合适的数(用后面的数依次跟指定位置上的数比较,如果后面的书比指定位置的数小,就交换两个数,依次重复,一直到下标的倒数第二个)
图解:
step1:在初始的元素中找到最小值放到第一个位置
step2:在剩余数中找出最小值放到第二个位置
如此依次找出最小值。直到剩最后两个数,再比较其大小。
代码实现思路:
(1)有len个数,len个数需要交换len-1轮,且数组下标从0开始,那么最外层循环是 i 的
取值是 [0,len-1),
(2)定义 j 变量,表示当前最小数的下标,每轮循环时,默认假设初始值是最小值,即初始赋值 j = i+1
(3)遍历除当前最小数以外剩余的数,如果发现有比当前最小数更小的数,则记录更小的数的下标,然后两数交换
#include<stdio.h>int main(void)
{int a[] = {4,1,3,5,7,0,9,2,6,8};int len = sizeof(a)/sizeof(a[0]);int i = 0;int j = 0;for(i = 0;i < len-1;++i) // 控制位置,i表示下标,给i号位置找数,当找到了前面len-1 个数,最后一个数就确定了{for(j = i+1;j<len;++j) // 表示给i号位置找合适的数,要和后面所有的数都比较{if(a[j]<a[i]) // a[i]表示要找合适数的那个位置的原先的值, 依次用j号位置 的值去和i号位置的值进行比较{int temp = a[i]; // 引入一个中间值a[i] = a[j]; // 交换a[i]和a[j]a[j] = temp;}}}for(i = 0;i < len;++i){printf("%d ",a[i]);}putchar('\n');return 0;
}
2.冒泡排序
思想:一次冒一个数,相邻两个元素两两比较,小的放前,大的放后。(0和1上的位置的值比较,1和2位置上的值比较,依次比较,每次找出来的是最大数--- 升序)
如果要将已知8个无序数列按从小到大排列,首先用第一个数和第二个数比较,如果后一个数比前一个数小,则交换位置,依次下去,进行7次比较,第一趟得出这组数的最大值,放在了数组最后一个位置,在我们后面的比较的时候,就不用再与其比较了,所以第二趟我们就进行6次比较,得出这组数的次大值,放在了下标为6的位置,如此循环进行循环7趟,就得到了我们由小到大的排序了。
#include<stdio.h>int main(void)
{int a[] = {4,1,7,0,3,2,5,8,6,9};int len = sizeof(a)/sizeof(a[0]);int i = 0;int j = 0;for (i = 1;i<len;++i) // 控制趟数{for(j = 0;j<len-i;++j) //一趟的比较过程{if(a[j]>a[j+1]){int temp = a[j];a[j] = a[j+1];a[j+1] = temp;}}}for(i = 0;i < len;++i){printf("%d ",a[i]);}putchar('\n');return 0;
}
3.插入排序
思想:首先把第一个位置上的数假设为最小数,用a[1]位置上的数与他比较,如果a[1]上的数比它小,则将a[0]的值赋给a[1]将a[1]的值放在a[0]的位置,再用a[2]与a[1]比较,如果·a[2]比它小则交换两个数,再把它与a[0]上的数比较,如此循环,直到最后两个数比较完。
#include<stdio.h>int main(void)
{int a[] = {3,2,5,4,1,8,6,9,7};int len = sizeof(a)/sizeof(a[0]);int i = 0;int j = 0;for(i = 1;i < len;++i) {int t = a[i]; // 拿数,记录此时 i 位置上的值j = i; // 准备要放的位置while(j>0 && t<a[j-1]) // 将 i 位置上的值依次与前面的数进行比较,直到有一个数比t 小或者到了a[0]的位置{a[j] = a[j-1]; // 挪位置--j;}a[j] = t;}for(i = 0;i<len;++i){printf("%d ",a[i]);}putchar('\n');return 0;
}
4.查找
4.1 二分查找
前提:数据得是有序的。
思想:先找到中间位置的数,用这个数和要找的数比较。(每次折一半,直到找到对应数组,或者结束),如果输入的数比中间数小,则输入数在数组的前一半,缩小范围,如果输入的数比中间数大,则表示输入数在数组的后一半,缩小范围继续查找。
#include<stdio.h>int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9};int len = sizeof(a)/sizeof(a[0]);int begin = 0;int end = len-1;int n;printf("Input a num:");scanf("%d",&n);while(begin <= end) {int mid = (begin+end)/2;if(n>a[mid]){begin = mid + 1; // 要查找的数比中间的数大,说明要找的数在后面一半,缩 小区间}else if(n<a[mid]){end = mid - 1; // 要查找的数比中间的数小,说明要找的数在前面面一半, 缩小区间}else // 要找的数和中间值相等,表示找到了{break;}}if(begin <= end) // 如果成立表示是从前面break出来的{printf("找到了!\n");}else{printf("没有这个数!\n");}return 0;
}
运行结果: