INT102
Week2 评估基础查找与排序算法
问题:查找
输入:一个n个数字的序列a0, a1, … an-1 和一个数字X
输出:确定X是否在序列中
代码实现:
i = 0
while i < n do
begin
if X == a[i] then
report "Found!" and stop
else
i = i+1
end
report "Not Found!"
输入:一个n个排序的数字序列a0, a1, …, an-1按升序排列,并输入数字X
- 把X和中间的数字作比较
- 然后只关注前半部分或后半部分(取决于X是小于还是大于中间的数字)
- 将要搜索的数字数量减少一半
代码实现:
first=0, last=n-1
while(first <= last) do
begin
mid = ⨽(frist+last)/2⨼ //⨽⨼是底函数,截断小数部分
if(X == a[mid])
report"Found!" & stop
else
if(X<a[mid])
last = mid-1
else
first = mid+1
end
report"Not Found!"
算法:该算法逐位扫描文本。
对于每个位置i,它检查模式P[0…m-1]出现在 T[i…i+m-1]中;如果模式存在,则找到文本,否则继续下一个位置 i+1;如果重复到最后没有成功,文本没有找到。
for i=0 to n-m do
begin
j = 0
while (j<m && P[j]==T[i+j]) do
j = j+1
if(j == m) then
report "found!"& stop
end
report "Not found!"
问题:排序
输入:一个n个数字的序列a0, a1,…, an-1
输出:将n个数字按照从小到大的升序排列
基本思想:从未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾,直到所有元素均排序完毕。
代码实现:
//选择排序
void selectSort(int arry[], int len){
for(int i = 0; i < len-1; i++){
int min = i;//假设第一个元素是最小的
for (int j = i + 1; j < len; j++){
if (arry[j] < arry[min]){
min = j;//保存最小元素的下标
}
}
//交换
int temp = arry[min];
arry[min] = arry[i];
arry[i] = temp;
}
}
//输出
void print(int arry[], int len){
for (int i = 0; i < len; i++){
printf("%d ", arry[i]);
}
}
int main(){
int arry[10]={15,36,26,27,24,46,44,29,52,48};
selectSort(arry,10);
print(arry,10);
printf("\n");
return 0;
}
从前到后,将原属组的相邻两数进行比较换位,直到数组末尾,此时末尾的数字已确定,第二次循环只需要比较0到n-1个数字,以此类推,在第i次循环只需要比较n-i+1个数,直到i等于n结束循环。
代码实现:
void main(){
int n[a];//定义一个大小为a的数组
int i, j, temp;
for (i = 1; i <= a-1; i++){ //外层循环是比较的轮数,数组内有10个数,那么就应该比较10-1=9轮
for (j = 0; j <= a-1-i; j++){ //内层循环比较的是当前一轮的比较次数,第一轮比较 a-1次
if (n[j] > n[j + 1]){//相邻两个数如果逆序,则交换位置
temp = n[j];
n[j] = n[j + 1];
n[j + 1] = temp;
}
}
}
for(i = 0;i<a;i++){
printf("%d",n[i]);
}
}
概念:将待排序的无序数列看成一个仅含有一个元素的有序数列和一个无序数列,将无序数列中的元素逐次插入到有序数列中,从而得到最终的有序数列。
思路:顺序遍历原始数组中的数,插入新数组中,将其放置于新数组里小于该数的数字与大于该数的数字之间。
#include <stdio.h>
void insertSort(int arry[], int len){
int temp;//保存要插入的元素
int j;//从当前要要比较插入的元素的前面一个开始
for (int i = 1; i < len; i++){//第一个元素视为有序,把后面的元素一个一个的插入到前面
temp = arry[i];
j = i - 1;
while (j >= 0&&arry[j]>temp){
arry[j + 1] = arry[j];//前面的元素往后面移动
j--;
}
arry[j + 1] = temp;//把要插入的元素,插入进对应的位置
}
}
//输出
void print(int arry[], int len){
for (int i = 0; i < len; i++){
printf("%d ", arry[i]);
}
}
int main(){
int arry[10]={3,44,38,5,47,15,36,26,27,2};
insertSort(arry,10);
print(arry,10);
printf("\n");
return 0;
}