C#常见排序算法(一)
排序算法是我们编程中遇到的最多的算法。目前主流的算法有8种。
今天给大家介绍三种排序算法:冒泡排序(o(n2)),选择排序(o(n2)),插入排序(o(n2))
1、选择排序是我觉得最简单暴力的排序方式了。
以前刚接触排序算法的时候,感觉算法太多搞不清,唯独记得选择排序的做法及实现。
原理:找出参与排序的数组最大值,放到末尾(或找到最小值放到开头)
过程解析:将剩余数组的最小数交换到开头
2、冒泡排序
冒泡排序是笔试面试经常考的内容,虽然它是这些算法里排序速度最慢的(汗),后面有测试为证。
原理:从头开始,每一个元素和它的下一个元素比较,如果它大,就将它与比较的元素交换,否则不动。
这意味着,大的元素总是在向后慢慢移动直到遇到比它更大的元素。
过程解析:中需要注意的是j<i,每轮冒完泡必然会将最大值排到数组最前面,所以需要排序的数应该是在减少的。
3.插入排序
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入到前面已经排序的数组中的适当位置上,直到全部插入完为止。
演示:
Code:
public void InsertionSort(double[] arr)
{
for (int i = 1; i < arr.Length; i++)//int[] arr = { 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48 };
{
// 定义待插入的数
double insertValue = arr[i];
// 找到待插入数的前一个数的下标
int insertIndex = i - 1;
while (insertIndex >= 0 && insertValue < arr[insertIndex])
{
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex + 1] = insertValue;
}
for (int j = 0; j < arr.Length; j++)//输出显示得在方法体内
{
Console.WriteLine(arr[j]);//System.out.println(Arrays.toString(arr));
}
}
static void Main(string[] args)
{
Program p=new Program();
Console.WriteLine("input 以英文逗号分隔!!"); string sdata = Console.ReadLine();//double[] data1 = { 4.2, 2.1, 8.2, 5.2 };
List<string> sLdata = new List<string>();
double[] data1=new double[(sdata.Length+1)/2];
sLdata=sdata.Split(',').ToList<string>();
List<double> DLdata = new List<double>();
DLdata = sLdata.ConvertAll(new Converter<string,double>(stringToDouble));
for (int k = 0,l = 0; k < DLdata.Count; k++,l++)
{ data1[l] = DLdata[k]; }
//p.BubbleSort(data1);
p.InsertionSort(data1);
//for (int i = 0; i < data1.Length; i++)
//{
// Console.WriteLine("{0}", data1[i]);
//}
}
private static double stringToDouble(string str)
{
return Convert.ToDouble(str);
}