引言:
老师已经是第三次跟我们讲排序了,可想而知排序它的重要性,这三种基本排序的方式值得我们思考和研究,理解其中的思想。
简述:
概念:
将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序
常见排序算法:
快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。
选择排序:
原理:
将初始序列(A[0]~A[n-1])作为待排序序列,按照从小到大进行排序,假设现在A[0]是最小的,将剩余的元素与其进行比较,如果比A[0]大,则互换位置,如果比A[0]小则不动,这样第一轮就轮完了,找到了最小的元素;第二轮,假设A[1]是次小的,将剩余的元素与其比较,找到次小的元素放到A[1]位置,依次进行下去,经过n-1轮排序,顺序就排好了。
示图:
代码实现:
class 选择排序
{
//定义一个数组
static List<int> list = new List<int>() { 48, 15, 26, 82, 65 };
static void Main(string[] args)
{
//调用排序方法
Choice();
PrintList ();
}
//选择排序
static void Choice()
{
//定义变量temp 和minIndex都为0
int temp = 0;
int minIndex = 0; //数组中最小数的下标
for (int i = 0; i < list .Count ; i++)
{
minIndex = i; //标记此下标为最小值
for (int j = i+1; j < list .Count ; j++)
{
//依次和数组中其他数据进行比较,如果其他数据比当前标记的数值小,则把较小数值的下标赋给minIndex
if (list[j]<list[minIndex])
{
minIndex = j;
}
}
//交换数据
temp = list[minIndex];
list[minIndex] = list[i];
list[i] = temp;
}
}
private static void PrintList()
{
foreach (var item in list)
{
Console.WriteLine(string.Format("{0}", item));
}
Console.WriteLine();
Console.ReadLine();
}
}
效果:
冒泡排序:
原理:
将初始序列(A[0]~A[n-1])作为待排序序列,按照从小到大进行排序,相邻的两个元素进行比较,则较大的数放到后面,这样一轮结束后最大的元素就放到了最后位置,依次进行,n-1轮之后,顺序就排好了。
示图:
代码实现:
class 冒泡排序
{
//定义一个数组
static List<int> list = new List<int>() { 48, 15, 7, 34, 25 };
static void Main(string[] args)
{
//调用排序方法
Bubble();
PrintList();
}
//冒泡排序
static void Bubble()
{
//定义临时变量
int temp = 0;
for (int i = list.Count; i > 0; i--)
{
for (int j = 0; j < i-1; j++)
{
//相邻的两个数进行比较,把较大的数放到后面
if (list[j] >list[j+1])
{
//交换数据
temp = list[j];
list[j] = list[j+1];
list[j+1] = temp;
}
}
}
}
private static void PrintList()
{
foreach (var item in list)
{
Console.WriteLine(string.Format("{0}", item));
}
Console.WriteLine();
Console.ReadLine();
}
}
效果:
插入排序:
原理:
给定序列,存在一个分界线,分界线的左边被认为是有序的,分界线的右边还没被排序,每次取没被排序的最左边一个和已排序的做比较,并插入到正确位置。(从小到大)
示图:
代码实现:
class 插入排序
{
//定义一个数组
static List<int> list = new List<int>() { 48, 15, 7, 34, 25 };
static void Main(string[] args)
{
//调用排序方法
Insert();
PrintList();
}
//插入排序
static void Insert()
{
for (int i=1;i <list.Count;i++)
{
//定义临时变量
int temp = list[i];
int j = i;
//如果在已经排好序的数列段中没有找到比新值小的数
while (j>0 && temp <list [j-1])
{
//将比新数值大的数向后移
list[j] = list[j - 1];
j--;
}
//如果在已经排好序的数列中找到比新数小的数值,将数值替换到此位置
list[j] = temp;
}
}
private static void PrintList()
{
foreach (var item in list)
{
Console.WriteLine(string.Format("{0}", item));
}
Console.WriteLine();
Console.ReadLine();
}
}
效果:
比较:
一张图胜过千言万语。
总结:
1.思想上移,行动下移。
2.实践了才知道是否正确