目录
一、顺序表查找
从头到尾或从尾到头查找。
//顺序表查找(需要判断两次)
int ListSearch(char ch)
{
for (int i = 0; i < strlen(str); i++) //一次判断
{
if (str[i] == ch) //二次判断
return i;
}
return -1;
}
顺序查找虽然简单,但是缺点也比较明显,就是效率比较低,两次判断,接下来对齐进行优化,让它变成一次判断:
二、顺序表查找优化(重点)
关键思想就是:设置哨兵。
把首或尾元素作为哨兵,判断到它了可以直接退出,不用外面的for循环一次次判断。
//顺序表查找优化(数据量大的时候有奇效)(只需要判断一次,比先前效率快一倍)
int ListSearch_Optimize(char ch)
{
int i = -1;
str[strlen(str)] = ch; //设置哨兵
while (str[++i] != ch); //不为哨兵,则继续循环(只需要判断一次,比先前效率快一倍)
return i;
}
总代码
//顺序表查找及优化
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string>
char str[20];
//输入
char Input()
{
char ch = ' ';
printf("请输入一串数组:\n");
for (int i = 0; i < 20 && ch != '\n'; i++)
{
scanf("%c", &ch);
str[i] = ch;
}
printf("请输入您想要查找的字符:");
scanf("%c", &ch);
return ch;
}
//顺序表查找(需要判断两次,效率较低)
int ListSearch(char ch)
{
for (int i = 0; i < strlen(str); i++) //一次判断
{
if (str[i] == ch) //二次判断
return i;
}
return -1;
}
//顺序表查找优化(数据量大的时候有奇效)(只需要判断一次,比先前效率快一倍)
int ListSearch_Optimize(char ch)
{
int i = -1;
str[strlen(str)] = ch; //设置哨兵
while (str[++i] != ch); //不为哨兵,则继续循环(只需要判断一次,比先前效率快一倍)
return i;
}
int main()
{
char ch;
ch = Input(); //输入
printf("顺序表查找结果: %d\n", ListSearch(ch)); //顺序表查找
printf("顺序表优化查找结果:%d\n", ListSearch_Optimize(ch)); //顺序表查找优化
return 0;
}
参考资料