排序算法和查找算法
法是用来解决常见问题的方法
同一个问题可以采用多种方法解决,不同
方法适用于不同的环境
排序指的是把一组数字按照某种顺序排列好
排序算法分很多次重复执行,每次负责把
一个数字放在合适的位置上
为了实现以上效果可以先确定数字然后查找
位置也可以先确定位置然后查找数字
通过不断调整两个数字的相互顺序最终把
合适的数字放在合适的位置上
1.冒泡排序算法
每次把一个数字放在最前边或最后边的
位置上
不断调整相邻两个数字的顺序最终把一个
数字放在最前或最后的位置上
2.选择排序算法
每次把一个数字放在最前边或最后边
的位置上
用选定位置里的数字和所有其他数字做
顺序调整,最终把合适的数字放在
这个位置里
3.插入排序
把没有排好序的数字中最前面或最后面的
数字插入到排好序的数字中合适的位置上
重复这个过程直到把所有数字都放在合适
的位置上
每次把要插入的数字和它前面或后面的数字
进行顺序调整,重复这个过程直到它
被放在合适的位置上
4.快速排序
从所有数字的最左边或最右边选择一个数字
作为基准数字,把它放在合适的位置上
对基准数字和所有其他数字依次进行顺序
调整,把比它小的都放在一边比它大
的放在另一边
对未处理的数字中两边的数字进行顺序调整,
调整后把其中不是基准数字的数字排除在
未处理范围之外
重复以上过程直到所有数字都被排除在未
处理数字范围外。这个时候基准数字就被
放在合适的位置上了
对左右两部分数字重复以上过程直到所有数字
都被放在合适的位置上
/* 冒泡排序算法演示 */ #include <stdio.h> void quick_sort(int *p_num, int size) { int base = *p_num, tmp = 0; int *p_start = p_num, *p_end = p_num + size - 1; if (size <= 1) { return ; } while (p_start < p_end) { if (*p_start > *p_end) { tmp = *p_start; *p_start = *p_end; *p_end = tmp; } if (*p_start == base) { //基准数字在前 p_end--; } else { //基准数字在后 p_start++; } } quick_sort(p_num, p_start - p_num); quick_sort(p_start + 1, p_num + size - 1 - p_start); } void bubble_sort(int *p_num, int size) { int num = 0, num1 = 0, tmp = 0; for (num = 0;num <= size - 2;num++) { for (num1 = size - 1;num1 >= num + 1;num1--) { if (*(p_num + num1 - 1) > *(p_num + num1)) { tmp = *(p_num + num1 - 1); *(p_num + num1 - 1) = *(p_num + num1); *(p_num + num1) = tmp; } } } } /*void bubble_sort(int *p_num, int size) { int num = 0, num1 = 0, tmp = 0; for (num = size - 1;num >= 1;num--) { //每次把一个数字放在下标为num的存储区里 for (num1 = 0;num1 <= num - 1;num1++) { //调整下标为num1和num1+1存储区 //中数字的顺序 if (*(p_num + num1) > *(p_num + num1 + 1)) { tmp = *(p_num + num1); *(p_num + num1) = *(p_num + num1 + 1); *(p_num + num1 + 1) = tmp; } } } }*/ void choice_sort(int *p_num, int size) { int num = 0, num1 = 0, tmp = 0; for (num = 0;num <= size - 2;num++) { for (num1 = num + 1;num1 <= size - 1;num1++) { if (*(p_num + num) > *(p_num + num1)) { tmp = *(p_num + num); *(p_num + num) = *(p_num + num1); *(p_num + num1) = tmp; } } } } /*void choice_sort(int *p_num, int size) { int num = 0, num1 = 0, tmp = 0; for (num = size - 1;num >= 1;num--) { //把没处理过的数字中最大数字放在下标为num的存储区里 for (num1 = 0;num1 <= num - 1;num1++) { //调整下标为num和num1存储区里数字的顺序 if (*(p_num + num1) > *(p_num + num)) { tmp = *(p_num + num1); *(p_num + num1) = *(p_num + num); *(p_num + num) = tmp; } } } }*/ void insert_sort(int *p_num, int size) { int num = 0, num1 = 0, tmp = 0; for (num = 1;num <= size - 1;num++) { //把下标为num的数字插入到前面合适的位置上 for (num1 = num - 1;num1 >= 0;num1--) { //调整下标为num1和num1+1存储区里数字的顺序 if (*(p_num + num1) > *(p_num + num1 + 1)) { tmp = *(p_num + num1); *(p_num + num1) = *(p_num + num1 + 1); *(p_num + num1 + 1) = tmp; } else { break; } } } } int main() { int arr[] = {34, 52, 25, 41, 97, 12, 66, 78, 81}; int num = 0; //bubble_sort(arr, 9); //choice_sort(arr, 9); //insert_sort(arr, 9); quick_sort(arr, 9); for (num = 0;num <= 8;num++) { printf("%d ", arr[num]); } printf("\n"); return 0; }
查找算法可以从一组数字里找到某一个数字
1.顺序查找
按顺序把每个数字和要查找的数字做对比
直到找到为止
如果数字之间没有规则就只能采用按顺序
查找的方法
2.折半查找
只能从有顺序的一组数字中找到某个数字
每次用中间位置的数字和要查找的数字
做对比,这样就可以排除一半的数字
重复这个过程直到找到结果
/* 查找算法演示 */ #include <stdio.h> int *half_search(const int *p_num, int size, int num) { const int *p_start = p_num, *p_end = p_num + size - 1, *p_mid = NULL; while (p_start <= p_end) { p_mid = p_start + (p_end + 1 - p_start) / 2; if (*p_mid == num) { return (int *)p_mid; } else if (*p_mid > num) { p_end = p_mid - 1; } else { p_start = p_mid + 1; } } return NULL; } int main() { int arr[] = {8, 12, 16, 21, 25, 32, 44, 47}; int *p_num = half_search(arr, 8, 44); if (p_num) { printf("查找结果是%d\n", *p_num); } return 0; }