⭐️数值计算与数据数据是计算机重要的工作。作为数据处理的基本操作,有排序(sort)和搜索(search)。
⭐️关于排序算法,有选择排序、冒泡排序、插入排序、希尔排序、堆排序、快速排序等。
⭐️关于搜索,常见的方法有顺序查找、二分法查找、哈希查找、二叉树查找。
3-0 排序与搜索
1 排序
排序(sort),可以理解为将一串数据按照某种规则排列。例如,像1 , 5 , 11 , 20 ... 从小到大排列叫做升序,反之从大到小排序叫做降序。在计算机中则可以判断字符串的大小,也就是按照词典决定大小关系。例如 a < aaa < ab < b ...的排列,可以称词典排序。
排序可以大致分为2部分,内排序和外排序。内排序是被排序的数据元素全部存放在计算机内存中的排序算法;若在排序的过程中需要使用到外部存储介质如磁盘等,这种涉及内外存储器数据交换的排序过程称为外排序。
内排序可以大致分为以下6种:
2 搜索
从大量数据中找出必要的数据这一操作叫做搜索(search)。搜索方法大致可以分为顺序查找和二分法查找。
数据一般如以下记录构成。
Lisa | 18 |
|<--域-->|<--域-->|
|<———记录———>|
一整个数据叫做记录(record),而一个记录是由多个域(field)组成的,我们想要搜索的域叫做key。
顺序查找法的基本思想是,从线性表的第一个或最后一个元素开始,顺序扫描整个线性表。其算法及其简单,用于线性表未被排序的情况下。若线性表的大小为n,其搜索计算量为O((n+1)/2)。
二分查找法是一种高效的查找方法。它的基本思想是将目标值与线性表中间的元素进行比较,如果目标值小于中间元素,则在数组的左半部分继续查找,否则在右半部分查找,不断缩小搜索范围,直到找到目标值或确定目标值不存在为止。二分查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。时间复杂度为O(logn)。
3-1 基本排序
例18 选择排序
⭐️背景:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
①设置一个变量i,让i从0至n-2循环。
②令i为最小值的初始值。
③变量i+1~n-1循环以下操作。
④寻找最小值,用s来记住它的位置。
⑤交换第i个元素和第s个元素。
⭐️运行:
#include <stdio.h>
#define N 6
int main()
{
int a[]={80,41,35,90,40,20};
int min,i,j,s,t;
for(i=0;i<N-1;i++){
min=a[i];
for(j=i+1;j<N;j++){
if(a[j]<min){
min=a[j];
s=j;
}
}
t=a[i];a[i]=a[s];a[s]=t;
}
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
运行结果如下:
20 35 40 41 80 90
☆.。.:*・°☆.。.:*・°☆.。.:*・°☆.。.:* ☆.。.:*・°☆.。.:*・°☆.。.:*・°☆.。.:*
练18-1 冒泡排序
⭐️背景:
冒泡排序其原理为依次比较两个相邻的元素,如果顺序错误则进行交换。走访元素的工作是重复地进行,直到没有相邻元素需要交换。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
⭐️运行:
#include <stdio.h>
#define N 6
int main()
{
int a[]={80,41,35,90,40,20};
int t,i,j;
for(i=0;i<N-1;i++){
for(j=N-1;j>i;j--){
if(a[j]<a[j-1]){
t=a[j];a[j]=a[j-1];a[j-1]=t;
}
}
}
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
//或者
#include <stdio.h>
#define N 6
int main()
{
int a[]={80,41,35,90,40,20};
int t,i,j;
for(i=0;i<N-1;i++){
for(j=0;j<N-1-i;j++){
if(a[j]>a[j+1]){
t=a[j];a[j]=a[j+1];a[j+1]=t;
}
}
}
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
运行结果如下:
20 35 40 41 80 90
☆.。.:*・°☆.。.:*・°☆.。.:*・°☆.。.:* ☆.。.:*・°☆.。.:*・°☆.。.:*・°☆.。.:*