- 查找
查找是在一批数据中查找指定的数据,如最值查找或指定值查找,查找结束后应该给出查找成功与否的结论.
目前常用的查找算法有顺序查找,二分法查找,hash查找、二叉排序树查找等
(1) 顺序查找
顺序查找指从数组的一端开始,顺序扫描数组中的每个元素,依次将扫描的数组元素和指定值相比较。若当前扫描的元素与指定值相等,则查找成功;反之则失败。
顺序查找是一种算法思想最简单的算法,它对于任何结构的数组都适用,并且不要求数组中元素有序排列,但是其查找效率很低,对于有序的数组或数据量太大的数组都不适宜采用。
例如:使用顺序查找法查找二位数组中的最小值最大值
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//利用顺序查找法查找二维数组中的最小值,最大值;
//设计变量保存二位数组中的最小值最大值以及他们的位置;
int max, min, maxRow, maxCol, minRow, minCol;
int[,] A = new int[2, 3] { { 1, 2, 3 }, { 4, 5, 6 } };
//对最值以及他们的位置进行初始化
max = A[0, 0];
min = A[0, 0];
maxRow = 0; maxCol = 0;
minRow = 0; minCol = 0;
//顺序扫描数组中的每一个元素并记录相应的数组的位置
for (int i = 0; i < 2; i++)
for (int j = 0; j < 3; j++)
{
if (max < A[i, j])
{
max = A[i, j];
maxRow = i;
maxCol = j;
}
if (min > A[i, j])
{
min = A[i, j];
minRow = i;
minCol = j;
}
}
Console.WriteLine("The Max Value is A[{0},{1}]:{2}", maxRow, maxCol, max);
Console.WriteLine("The Min Value is A[{0},{1}]:{2}", minRow, minCol, min);
Console.Read();
}
}
}
(2) 二分法查找:
二分法查找又称为折半查找,其算法的步骤如下:
① 假设数组中元素是按照升序排列,首先将数组中间位置的元素与查找指定值比较,如果两者量筒,则查找成功
② 否则利用中间位置记录将数组分成前后两个字数组,如果中间位置的元素值大于查找指定值,则进一步查找前一个数组,否则进一步查找后一个数组。
③ 重复以上过程,直到找到满足条件的记录,使查找成功或直到数组不存在为止,此时查找不成功。
④ 二分法的优点是比较次数少,查找速度快,平均性能好;其缺点就是要求待查数组为有序数组。
利用二分法查找算法在有序地以为数组中查找指定值。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int low, high, mid, pos = -1;
string sName;
string[] Name = new string[15] { "Alice", "Bob", "Carol", "David", "Even", "Frank", "George", "Jerry", "Jhon", "Kitty", "Larry", "Marry", "Nancy", "Smith", "Tom" };
Console.WriteLine("please enter the search name:");
sName = Convert.ToString(Console.ReadLine());
low = 0;
high = Name.GetLength(0) - 1;
while (high >=low)
{
mid=(low+high)/2;
//数组中间位置的元素与查找指定值比较,如果两者相同,则查找成功
if (String.Equals(sName, Name[mid]))
{
pos = mid;
break;
}
//根据中间值与待查找值的关系,确定继续查找的字数组。
if (String.Compare (sName,Name[mid])>0)
low=mid+1;
else
high=mid-1;
}
if (pos ==-1)
Console .WriteLine ("Not found");
else
Console .WriteLine ("Name[{0}]:{1}",pos ,Name[pos]);
Console.ReadLine();
}
}
}
3.排序
(1)冒泡
Bubble Sort,是计算机科学领域的一种简单的排序方法,它重复的走过要排序的数列,一次比较量两个元素,如果他的顺序错误就把他们交换过来。走访数列的工作是在重复的进行的直达无需交换,也就是说该数列已将排序完成。
以升序排列为例,冒泡排序算法的流程如下:
将被排列的记录数组A垂直排列,每个记录A[i]看作是重量为A[i]值得气泡
根据轻气泡不能在重气泡之下的原则,从下往上(或从上往下)扫描数组A:凡扫描到违反原则的轻气泡,就时其向上“漂浮”。如此反复进行,直到最后任何两个气泡都是轻者在上重者在下。
冒泡排序就是讲最小的元素往前调或者把大的元素往后调。比较是相邻的两个元素,交换也是相邻的这两个元素之间。所以,如果;两个元素相等,不会发生交换;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,因此冒泡法是一种稳定的排序算法。
int A[]=new int [10];
int temp;
for (int i=0;i<10;i++)
A[i]=Convert .ToInt32(Console .ReadLine());
for (int i=0;i<10-1;i++)
for (int j=10-i;j>i;j++)//
if (ê?§A[j]>A[j-1])
{
temp=A[j];
A[j]=A[j-1];
A[j-1]=temp;
}
foreach(int t in A)
Console.Write(t+" ");
Console.ReadLine ();
(3) 选择排序
(Selection Sort)是每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排序好的数列的最后,直到全部待排序的数据元素排序完。
int[] A=int[10];
int minPos,temp;
for (int i=0;i<10;i++)
A[i]=Convert .ToInt32 (Console.ReadLine ());
for (int i=0;i<10-1;i++)//控制进行n-1趟扫描
{
minPos =i;//将最值得位置初始化为无序区的第一个元素
for (int j=i+1;j<10;j++)、、控制第i趟的扫描范围
if (A[j]<A[minPos])minPos =j;//记录最值得位置
if (minPos !=i)//将最值与无序区的第一个元素进行交换
{
temp =A[minPos ];
A[minPos ]=A [i];
A[i]=temp;
}
}foreach(int t in A )//输出排序后的数组
Console.Write (t+" ");
4.形参数组
①在一个形参;列表中醉倒只有一个形参数组;
① 如果参数列表中存在形参数组,那么形参数组必须是参数列表中的最后一个
② 形参数组必须是一维数组
③ 不能将形参数组和ref、out修饰符组合起来使用
④ 除了允许在调用使用可变数量的实参,形参数组与同一类型的值形参完全等效。
形参数组室友借助关键params和[]完成声明的
void Text(params int[] invals)\
对形参数组的调用
(1) 用逗号分隔开的该数据类型的元素列表,要求所有元素必须是方法声明中指定的类型,例如上述Text方法的调用Text(10,20,30)
(2) 一个元素为该数据类型的数目,例如Text调用
int [] intArray =new int [3]{1,2,3};
Text(intArray);
注意调用含有形参数组的方法时实参处不需要使用params
编写方法计算10个学生的总成绩按照总成绩降序排列学生信息:
第一步就是录入相应的学生的成绩信息进入数组
第二步将数组中的学生成的总值进行相加得到相应的总成绩然后将总成绩并入到数组之中
依靠关键的学生的排名进行排序