常见查找,排序算法

1.顺序表的查找

所谓顺序表,特点是相邻记录的物理位置也是相邻的。

1)顺序查找

算法思路:给定一个key值,在表中顺序对比,若存在k = key,则查找成功,返回记录序号,或者成功1,失败返回0;

2)折半查找

对于有序的顺序存储表来说,可以用这个方法挺高查找效率。

算法思路:

1>给定值key,逐步确定待查记录所在区间,每次将搜索空间减少一半,直到查找成功或者失败为止。

2>设两个指针(或者游标)low,high,分别表示头和尾,初始时low = 1,high = n令mid = (low+high)/2;

3>将mid指向的值与key值比较如果mid<key,则说明要找的值应该往high靠近,令low = mid+1;比较如果mid>key,则说明要找的值应该往low靠近,令high = high-1;当key = mid所指向的值或者low<=high不满足时返回。

简单代码举例:

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10
#define TRUE 1
#define FALSE 0

int bin_search(int *list, int len, int key);

int main (int argc, char *argv[])
{
	int list[MAXSIZE] = {1,3,5,7,9,11,13,15,17,19};
	int key = 18;
	printf("%d\n",bin_search(list, MAXSIZE, key));
	return 0;
}

int sqserch(int *list, int len, int key)//顺序查找
{
	int i;
	i = len;
	while(list[i] != key && i>=0)i--;
	return i;
}

int bin_search(int *list, int len, int key)//折半查找
{
	int low = 0, hight = len-1, mid;
	while(low <= hight){
		mid = (low + hight) / 2;
		if(list[mid] == key)
			return TRUE;
		if(list[mid] < key){
			low = mid + 1;
		}
		else{
			hight = mid - 1;
		}
	}
	return FALSE;
}
2.排序算法

1)插入排序

直接插入排序和折半插入排序

举例:设文件记录的key集合k = {50,36,66,76,95,12,25,36 };

[50],36

[36, 50], 66

[36,50,66], 76

[36,50,66,76], 95

[36,50,66,76,95] ,12

[12,36,50,66,76,95]25

[12,25,36,50,66,76,95]36

[12,25,36,36,50,66,76,95]

算法思路:将第一个看成是一个有序的子文件,然后从第二个开始,在前面有序的子文件中寻找插入的位置,在寻找的过程中可以折半的查找来提高寻找的效率。

2)交换排序

冒泡排序和快速排序

快速排序是对冒泡排序的一种改进,目的是提高排序效率

快速排序算法思路:

这待排序文件的key集合k={k1,k2,k3,k4,k5,k6,...,kn},对k中的k1,称作枢轴或基准。

1>逆序比较:j指向表尾,每次k1与kj,若k1<kj,则k1不可能在kn位置,j-1,直到k1>kj为止,交换k1与kj。

2>正序比较:i指向表头,每次k1与ki比较,若k1>ki,则k1不可能在ki左边,i+1,直到k1<ki为止,交换k1与ki。

3>第一次遍历完后,k1的左边都是小于k1的,右边都是大于k1的。

套用上述排序过程(可递归),直到每个子表只含有一项时,排序结束。

程序举例:

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10
#define TRUE 1
#define FALSE 0

void insert_sort(int *list, int len);
void quick_sort(int *list, int start, int end);

int main (int argc, char *argv[])
{
	int i = 0;
	int list[MAXSIZE+1] = {0,2,5,3,8,4,9,7,6,1,11};
	insert_sort(list, MAXSIZE);
	quick_sort(list, 1, 10);
	for(i = 1; i <= MAXSIZE; i++)
		printf("%d,",list[i]);
	putchar('\n');
	return 0;
}

void insert_sort(int *list, int len)//直接插入排序
{
	int i, j;
	for(i = 2; i <= MAXSIZE; i++){
		list[0] = list[i];
		for(j = i-1; list[j] > list[0]; j--){
			list[j+1] = list[j];
		}
		list[j+1] = list[0];
	}
}

void quick_sort(int *list, int start, int end)//快速排序
{
	int i = start, j = end;
	if(start < end){
		list[0] = list[start];
		while(i < j){
			while(i < j && list[0] < list[j]){
				j--;
			}
			list[i] = list[j];
			while(i < j && list[0] > list[i]){
				i++;
			}
			list[j] = list[i];
		}
		list[i] = list[0];
		
		quick_sort(list, start, i-1);
		quick_sort(list, i+1, end);
	}
	
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值