前言
学习3种数组排序,2种查找法方法:
排序方法:选择法排序,直接法排序,冒泡法排序
查找方法:顺序查找。2分查找法
在这里我认为看会代码就是最好的我解释,当然注释也是非常重要的,
1.选择法排序
一般常用方法
选择法排序。从键盘输入10个数,要求按升序排序,输出排序结果 f
(1)利用循环语句由键盘输入10个数依次放入a数组。{k= for(i=①第1轮用a[0]依次与 a[1],a[2],…,a[9]进行比较,若次序不对就交换。本轮结束后,a[0]中就是10个数中的最小数。
②第2轮用a[1]依次与a[2],…,a[9]进行比较,处理方法与①相同。[1]中为10个数中的次小数。
③重复上述过程,至第9轮,比较a[8]与a[9],把小者存入a[8],此时a[9]最大数。到此为止,10个数已按升序排好。
环变量j从i+1循环到9。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int i, j, t, a[10]; printf("请输人10个整数:"); for (j = 0; j < 10; j++) { scanf("%d", &a[j]); } printf("\n"); for (i = 0; i < 9; i++) {/* 外循环,循环9次*/ for (j = i + 1; j < 10; j++) {/*内循环 */ if (a[i] > a[j]) {//如果前面的数比后面的大 t = a[i]; a[i] = a[j]; a[j] = t;/*交换位置*/ } } } printf("排序之后:\n"); for (j = 0; j < 10; j++) { printf("%4d",a[j]); } return 0; }
结果:
2.直接法排序
直接法排序是选择排序的改进方法。例6.7的程序代码中,用于排序的双重循环中,每当a[i]>a[j]时,就交换 a[i]与a[j],实际上不需要每次都交换,只要增设一个变量k,用于记录每次较小数的下标,只需在本轮比较结束后,交换a[i]与a[k]即可
#include<stdio.h> int main() { int i, j, t, a[10], k; printf("请输人10个整数:"); for (j = 0; j < 10; j++) { scanf("%d", &a[j]); } printf("\n"); for (i = 0; i < 9; i++) {/* 外循环,循环9次*/ k = i; for (j = i + 1; j < 10; j++) { if (a[k] > a[j]) { k = j;//记录最小的数的下标 } } if (i != k) {//这里是前面令k = i,如果交换了k就不等于i了 t = a[k], a[k] = a[i], a[i] = t; } } printf("排序之后:\n"); for (j = 0; j < 10; j++) { printf("%4d",a[j]); } return 0; }
结果:
3.冒泡排序法
从键盘输入6个数据,存放到a[0]~a[5]的6个数组元素中。
①第1轮从a[0]到a[5]依次把两个相邻的元素两两比较,即a[0]与a[1]比,a[1]与a[2]比,.,a[4]与a[5]比。
每次相邻元素比较后,若顺序不对,则交换两个元素的值,否则不交换。假如数组a中a[0]~a[5]存放的6个数据如下:376524
从 a[0]到a[5]依次两两元素比较
结果:
4.⼆分查找
include <stdio.h> int main() { int arr[] = {1,2,3,4,5,6,7,8,9,10}; int left = 0; int right = sizeof(arr)/sizeof(arr[0])-1; int key = 7;//要找的数字 int mid = 0;//记录中间元素的下标 int find = 0; while(left<=right) { mid = (left+right)/2; if(arr[mid]>key) { right = mid-1; } else if(arr[mid] < key) { left = mid+1; } else { find = 1; break; } } if(1 == find ) printf("找到了,下标是%d\n", mid); else printf("找不到\n"); }