不废话,上代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 排序算法
{
class Program
{
static void Main(string[] args)
{
int[] array = { 12, 3, 1, 4, 55, 19, 3, 6, 234, 76, 14, 5, 0, 23 }; //数组
//array.BubbleSort(); //冒泡排序
//array.SelectionSort(); //选则排序
array.InsertSort(); //插入排序
foreach (int item in array)
{
Console.Write(item + "、");
}
Console.ReadKey();
}
}
/// <summary>
/// 排序工具类
/// </summary>
public static class SortToolClass
{
/// <summary>
/// 将数组进行冒泡排序,返回从小到大,排序好的数组
/// </summary>
/// <param name="arry"></param>
/// <returns></returns>
public static int[] BubbleSort(this int[] array)
{
for (int i = 0; i < array.Length -1; i++)
{
for (int j = 0; j < array.Length -1 -i; j++) //由于大数往下沉,每次循环,最后一个必定是大树,所以减去i值
{
int temp = array[j]; //记录当前元素
if(array[j] > array[j+1]) //跟后一个元素比较,大于则交换
{
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
return array;
}
/// <summary>
/// 将数组进行选择排序,返回从小到大,排序好的数组
/// </summary>
/// <param name="arry"></param>
/// <returns></returns>
public static int[] SelectionSort(this int[] array)
{
int index = 0; //存放每次最小数的索引位置
int temp = 0; //用来交换
for (int i = 0; i < array.Length -1; i++)
{
index = i;
for (int j = i+1; j < array.Length; j++)
{
if(array[j] < array[index]) //每次记录小于的数,也可以记录最大数,试试更改为大于号
{
index = j;
}
}
temp = array[i];
array[i] = array[index];
array[index] = temp;
}
return array;
}
/// <summary>
/// 将数组进行插入排序,返回从小到大,排序好的数组
/// </summary>
/// <param name="arry"></param>
/// <returns></returns>
public static int[] InsertSort(this int[] array)
{
for (int i = 1; i < array.Length; i++) {
int index = i - 1;
int temp = array[i];
while (index >= 0 && array[index] > temp)
{ array[index + 1] = array[index--];
}
array[index + 1] = temp;
}
return array;
}
}
}
分析
冒泡排序:
重复走访排序的数列,比较相邻元素,如果错误则交换。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端
选择排序:
在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,
然后从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾
插入排序:
对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。