INT102

INT102

Week2 评估基础查找与排序算法

问题:查找

  • 线性查找(Linear Search --> O(n))

输入:一个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!"
  • 二分法查找(Binary Search --> O(logn))

输入:一个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!"
  • 寻找连续子串出现位置(Search for a pattern)

算法:该算法逐位扫描文本。
对于每个位置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个数字按照从小到大的升序排列

  • 选择排序(Selection Sort -->O(n2))

基本思想:从未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾,直到所有元素均排序完毕。
请添加图片描述
代码实现

//选择排序
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;
}
  • 冒泡排序(Bubble Sort -->O(n2))

从前到后,将原属组的相邻两数进行比较换位,直到数组末尾,此时末尾的数字已确定,第二次循环只需要比较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]);
  }
}
  • 插入排序(Insertion Sort --> O(n2))

概念:将待排序的无序数列看成一个仅含有一个元素的有序数列和一个无序数列,将无序数列中的元素逐次插入到有序数列中,从而得到最终的有序数列。
思路:顺序遍历原始数组中的数,插入新数组中,将其放置于新数组里小于该数的数字与大于该数的数字之间。

#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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值