示例数组{3,1,5,2,4}
冒泡排序
以升序为例
for (int i = 0; i < arr.Length; i++)//轮数
{
for (int j = 0; j < arr.Length - i - 1; j++)//次数
{
if (arr[j] > arr[j + 1])
{
int t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
第一轮
第一次
j下标从0开始,第0位与第1位相比较,当第0位大于第1位时(3>1),进行交换。交换完数组为{1,3,5,2,4}
第二次
j为1,第1位与第2位比较,3<5,不交换。{1,3,5,2,4}
第三次
j为2,第2位与第3位比较,5>2,交换。数组为{1,3,2,5,4}
第四次
j为3,第3位与第4位比较,5>4,交换。数组为{1,3,2,4,5}
第一轮交换完毕后,确定了5为数组中最大的数,第二轮交换时,只交换前4位。以此类推
选择排序
示例数组{3,1,5,2,4}
for (int i = 0; i < arr.Length - 1; i++)
{
int t = arr[i];
int index = i;
for (int j = i + 1; j < arr.Length; j++)
{
if (t > arr[j])
{
index = j;
t = arr[j];
}
}
int temp = arr[i];
arr[i] = t;
arr[index] = temp;
}
第一轮
将数组中每一个元素与第0个元素进行比较,记录下最小的元素的值与下标,查找完一次后,将最小的元素与第0个交换,即确定了数组中最小的元素。交换完后数组为{1,3,5,2,4}
第二轮
因为第一轮确定了最小值,第二轮只需要查找3,5,2,4中最小值即可。
插入排序
示例数组{3,1,5,2,4}
for (int i = 0; i < arr.Length - 1; i++)
{
for (int j = i + 1; j > 0; j--)
{
if (arr[j] < arr[j - 1])
{
int t = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = t;
}
}
}
第一轮
第一次
用第1位与第0位比较,将较小的交换到前面。{1,3,5,2,4}
第二轮
第一次 j=2
用第2位与第1位相比较,5>3不交换。
第二次 j=1
用第1位与第0位比较,3>1不交换。 以此类推。
总结
三种算法各有特点。
冒泡每次比较相邻的两个数,先确定最后的数。
插入先确定前面的数,每次比较相邻的数。
选择先找本轮中最小值,记录下标与值,将最小值与最前面的值交换。