【C#基础知识】之结构、数组及常用的几种排序方法总结
2011-11-26 19:25
1411 查看
一、结构:
为什么要用结构?
1、比如我们上课讲的为了存储一个人的信息,要声明一组变量。当我们要存储n个人的信息时,就比较麻烦要声明n组变量。
2、存储一个人的信息的这几个变量间没有关系,容易记乱。
语法:
访问修饰符 struct 结构名 public是.net的四种最常用的访问修饰符
{
定义结构成员(变量) //前面必须加访问修饰符
}
例如:定义一个名叫Person的结构
数组可以帮我们一次声明多个同类型的变量,这些变量在内存中是连续存储的。
1)用法:数据类型[] 数组名=new int[5];
例如:int[] scroe=new int[5];//声明了一个长度为5的数组,里面包含5个int类型的变量(即元素)。
2) 几乎任意类型都可以声明数组。整形(整数或浮点数):int[] nums={5,3,8} 字符串: string[] name = { "张三", "李四", "王五" };
例如:int[] nums=new int[3]{5,3,8}//个数和声明数必须一致;int nums=new int{5}{5,2,1}//错误,不一致;int[] nums=new int[]{5,3,8} //正确,可以省略数组个数,建议用此方法声明不确定的数组内容。使用索引器访问指定编号位置的元素,访问数组元素:nums[0]、nums[1]。索引从0开始,取到的元素的类型就是数组元素的类型,还可以对数组元素进行赋值。
3) 常见问题:求平均值,求最大值,求和,排序等。
4)计算输入数组的和:int Sum(int[] values) 当形参是数组时,传递的是数组名。
int[] age={18,19,20,21,22,23};
Test(age);
Public static void Test(int[] number)
{
}
即为:
int[] age={18,19,20,21,22,23};
Test(age[0],age[1]);
Public static void Test(int a,int b)
{
}
eg1:整形数组:int[] 数组名=new int[];
eg2:字符串数组:string[] 数组名={"aaa","bbb","ccc"}
三、编程中经典的排序方法(即算法)分为以下几种:
1:插入排序: a.直接插入排序 b.希尔排序
2:交换排序:a.冒泡排序 b.快速排序
3:选择排序:直接选择排序
4:归并排序 :.归并排序
5:分配排序 :a.箱排序 b.基数排序
其中常用的三种排序:1.直接选择排序 2.直接插入排序 3.冒泡排序;
第一种:冒泡排序
原理:对一个数列,我们将它进行轮循和交换,每次轮循出最大数或最小数放在对尾,依次进行循环,轮循长度为-1。
冒泡排序:让数组中的元素两两比较(第i个与第i+1个比较),经过n(i-1)遍两两比较,数组中的元素按照我们预期的规律排序。要从大到小排序,我们进行两两比较的时候用。
例如:10,20,30,40,50,60,70 原始数据7个元素
20,30,40,50,60,70,10 第1趟 比较6次
30,40,50,60,70,20,10 第2趟 比较5次
40,50,60,70,30,20,10 第3趟 比较4次
50,60,70,40,30,20,10 第4趟 比较3次
60,70,50,40,30,20,10 第5趟 比较2次
70,60,50,40,30,20,10 第6趟 比较1次
也就是n个数需要排n-1趟;第t趟比较的次数为:n-t次。i=0 第一趟 i=1 第二趟 趟数:i+1 t=i+1 即可写出一个循环:for(int j=0;j<n-t;i++)将t用i代替为:for(int j=0;j<n-i-1;i++)
【公式套用】
for(int i=0;i<numbers.length-1;i++)
{
for(int j=0;j<numbers.length-1-i;j++)
{
if(numbers[j]<numbers[j+1])//从大到小排序就用"<"号;反之用">"号
{
借助一个中间变量进行值交换
}
}
}
练习:一个无序数组按从小到大顺序排列
第二种:选择排序
原理:对一个数列,我们选出最大或最小的数,放在队尾,依次循环下去,循环长度为-1;由于没有冒泡排序那每次都要比较,因此比冒泡排序要快。
第三种:插入排序
原理:对一个数列,我们从第二个数开始,将它与它前面的数字进行比较,每次选出最大
或最小的数放在队首,因而形成一个有序的队列,所以它比选择排序更快。
以上的三种方法是我自己平时学习时用过的,简单、通俗易懂。代码是学习笔记时编写的难免会出点错误,请指示!
为什么要用结构?
1、比如我们上课讲的为了存储一个人的信息,要声明一组变量。当我们要存储n个人的信息时,就比较麻烦要声明n组变量。
2、存储一个人的信息的这几个变量间没有关系,容易记乱。
语法:
访问修饰符 struct 结构名 public是.net的四种最常用的访问修饰符
{
定义结构成员(变量) //前面必须加访问修饰符
}
例如:定义一个名叫Person的结构
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public enum Gender //枚举变量前一定要加上public,不然会出现类型不一致的情况 { 男, 女 } public struct Person //定义一个名叫Person的结构 { public string name;//结构的成员 public Gender sex; public int age; } class Program { static void Main(string[] args) { Person onePerson; onePerson.name = "张三"; onePerson.sex = Gender.男; onePerson.age = 20; Console.WriteLine("大家好!我叫:{0},我今年:{1}岁了,我是:{2}性", onePerson.name, onePerson.age, onePerson.sex);//有英文状态下的逗号可以换行 Person secPerson; secPerson.name = "李四"; secPerson.sex = Gender.女; secPerson.age = 18; Console.WriteLine("大家好!我叫:{0},我今年:{1}岁了,我是:{2}性", secPerson.name,secPerson.age,secPerson.sex); Console.ReadKey(); } } }二、数组介绍及其用法:
数组可以帮我们一次声明多个同类型的变量,这些变量在内存中是连续存储的。
1)用法:数据类型[] 数组名=new int[5];
例如:int[] scroe=new int[5];//声明了一个长度为5的数组,里面包含5个int类型的变量(即元素)。
2) 几乎任意类型都可以声明数组。整形(整数或浮点数):int[] nums={5,3,8} 字符串: string[] name = { "张三", "李四", "王五" };
例如:int[] nums=new int[3]{5,3,8}//个数和声明数必须一致;int nums=new int{5}{5,2,1}//错误,不一致;int[] nums=new int[]{5,3,8} //正确,可以省略数组个数,建议用此方法声明不确定的数组内容。使用索引器访问指定编号位置的元素,访问数组元素:nums[0]、nums[1]。索引从0开始,取到的元素的类型就是数组元素的类型,还可以对数组元素进行赋值。
3) 常见问题:求平均值,求最大值,求和,排序等。
4)计算输入数组的和:int Sum(int[] values) 当形参是数组时,传递的是数组名。
int[] age={18,19,20,21,22,23};
Test(age);
Public static void Test(int[] number)
{
}
即为:
int[] age={18,19,20,21,22,23};
Test(age[0],age[1]);
Public static void Test(int a,int b)
{
}
eg1:整形数组:int[] 数组名=new int[];
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int sum = 0; int[] score = new int[10]; for (int i = 0; i < score.Length; i++) { //为数组中的每一个元素赋值 Console.WriteLine("请输入第{0}个学生的成绩", i + 1); score[i] = Convert.ToInt32(Console.ReadLine()); //sum += score[i];可以省去第二个for循环 //输出数组中的每一个元素的值 Console.WriteLine("第{0}个学生的成绩为:{1}", i + 1, score[i]); } //通过一个循环,求一个数组中所有元素的和(遍历) for (int i = 0; i < score.Length; i++) { sum += score[i]; } Console.Clear();//清屏 Console.WriteLine("{0}个人的平均成绩为:{1}", score.Length, sum / score.Length); Console.ReadKey(); } } }
eg2:字符串数组:string[] 数组名={"aaa","bbb","ccc"}
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string[] name = { "张三", "李四", "王五", "小明", "小华" }; for (int i = 0; i < name.Length; i++) { Console.WriteLine(name[i]); } Console.WriteLine("将数的内容倒序输出后为:"); for (int i = name.Length - 1; i >= 0; i--) { Console.WriteLine(name[i]); } Console.ReadKey(); } } }
三、编程中经典的排序方法(即算法)分为以下几种:
1:插入排序: a.直接插入排序 b.希尔排序
2:交换排序:a.冒泡排序 b.快速排序
3:选择排序:直接选择排序
4:归并排序 :.归并排序
5:分配排序 :a.箱排序 b.基数排序
其中常用的三种排序:1.直接选择排序 2.直接插入排序 3.冒泡排序;
第一种:冒泡排序
原理:对一个数列,我们将它进行轮循和交换,每次轮循出最大数或最小数放在对尾,依次进行循环,轮循长度为-1。
冒泡排序:让数组中的元素两两比较(第i个与第i+1个比较),经过n(i-1)遍两两比较,数组中的元素按照我们预期的规律排序。要从大到小排序,我们进行两两比较的时候用。
例如:10,20,30,40,50,60,70 原始数据7个元素
20,30,40,50,60,70,10 第1趟 比较6次
30,40,50,60,70,20,10 第2趟 比较5次
40,50,60,70,30,20,10 第3趟 比较4次
50,60,70,40,30,20,10 第4趟 比较3次
60,70,50,40,30,20,10 第5趟 比较2次
70,60,50,40,30,20,10 第6趟 比较1次
也就是n个数需要排n-1趟;第t趟比较的次数为:n-t次。i=0 第一趟 i=1 第二趟 趟数:i+1 t=i+1 即可写出一个循环:for(int j=0;j<n-t;i++)将t用i代替为:for(int j=0;j<n-i-1;i++)
【公式套用】
for(int i=0;i<numbers.length-1;i++)
{
for(int j=0;j<numbers.length-1-i;j++)
{
if(numbers[j]<numbers[j+1])//从大到小排序就用"<"号;反之用">"号
{
借助一个中间变量进行值交换
}
}
}
练习:一个无序数组按从小到大顺序排列
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int[] scores = { 85, 78, 88, 86, 98, 67, 48, 77, 79, 81, 83, 55, 25, 15, 5 }; for (int i = 0; i < scores.Length - 1; i++) { for (int j = 0; j < scores.Length - 1 - i; j++) { if (scores[j] < scores[j + 1])//从大到小排序就用"<"号;反之用">"号 { int temp = scores[j]; scores[j] = scores[j + 1]; scores[j + 1] = temp; } } } Console.WriteLine("从小到大依次排序结果为:"); for (int i = 0; i < scores.Length; i++) { Console.WriteLine(scores[i]); } Console.ReadKey(); } } }
第二种:选择排序
原理:对一个数列,我们选出最大或最小的数,放在队尾,依次循环下去,循环长度为-1;由于没有冒泡排序那每次都要比较,因此比冒泡排序要快。
public class 选择排序 { private int min; public void Sort(int[] arr) { for(int i=0;i<arr.length-1;i++) { min=i; for(int j=i+1;j<arr.length;j++) { if(arr[j]<arr[min]) { min=j; } } int temp=arr[min]; arr[min]=arr[i]; arr[i]=temp; } } }
第三种:插入排序
原理:对一个数列,我们从第二个数开始,将它与它前面的数字进行比较,每次选出最大
或最小的数放在队首,因而形成一个有序的队列,所以它比选择排序更快。
public class 插入排序 { public void Sort(int[] arr) { for(int i=1;i<arr.length;i++) { int temp=arr[i]; int j=i; while((j>0)&&(arr(j-1)>temp)) { arr[j]=arr[j-1]; --j; } arr[j]=temp; } } }
以上的三种方法是我自己平时学习时用过的,简单、通俗易懂。代码是学习笔记时编写的难免会出点错误,请指示!
相关文章推荐
- OC中常用的数组排序有以下几种方法
- C#基础知识之方法重载总结
- java基础知识1--String常用方法总结
- C#高级语法基础知识总结3——数组
- 黑马程序员——Java语言基础——02.java语言基础组成(4)数组及常用排序方法
- Java基础学习应用_数组常用方法与排序(一)
- C#数组排序的两种常用方法
- 几种常用排序方法的C#实现
- c#基础知识---Thread 类常用的属性和方法
- 黑马程序员_JavaSE基础知识总结三:方法和数组
- C#中几种常用的处理字符串的方法总结
- JavaScript基础知识及常用方法总结
- js数组去重的几种常用方法总结
- C#窗体间通讯的几种常用处理方法总结
- JavaScript基础知识及常用方法总结
- Objective-C中数组对象排序的方法(OC中NSString的常用API的基础应用2)
- java基础知识4--数组的常用方法(Array)
- C# 拷贝数组的几种方法(总结)
- 几种常用的C#排序方法简介
- java 运用数组常用的几种排序方法