以下示例都是从小到大进行排序。
一、冒泡法排序
过程:从第一个数据开始,比较该数据和右边的数据的大小,如果比右边数据大,就进行交换,依次进行直到最后。
对于每一次内层循环结束后的结果:都会在当前排序序列的最后一位产生一个最大的数。
public static void BubbleSort(int [] arr)
{
for (int i = 0; i < arr.Length-1; i++)
{
for (int j = 0; j < arr.Length-1-i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
注:所谓冒泡法,是指从小到大排列时,最小的数是渐渐冒到前面来的,而最大的数是每次内层循环结束直接产生的。
二、选择排序
过程:从第一个数据开始,按照“打擂台”算法,假定它是最小的一个数,去跟其他后面所有的数进行比较,如果有更小的数,就将那个数与我们假定的最小数进行交换,内层循环结束就得到一个当前序列的最小的一个数,然后将它放在前面。依次进行,直到最后。
对于每一次内层循环结束后的结果:都会产生当前序列的最小的一个数,然后将它放在前面,再从第二数进行上述步骤,循环后会得到第二小的数,以此类推。
public static void SelectionSort(int[] arr)
{
for (int i = 0; i < arr.Length-1; i++)
{
//保留序号方便交换
int minIndex = i;
for (int j = i; j < arr.Length; j++)
{
if (arr[j] < arr[minIndex])
{
minIndex = j;
}
}
//此时的j就是从i到最后整个序列中最小的数的序号
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
三、插入排序
过程:从第二个数据开始,找该数据的前面的数据,如果前面的数据大于该数据,就让前面的数据向后移动(覆盖原本数据,原本数据用temp保存),直到第一个数据,最后再将temp数据放置在停止移动的位置那里,插入完成。
举例:例如有数据这样的数据:8,1,5,4,7。手动模拟插入排序的过程:第二个数1,用temp =1保存1的值,用j保存此时前面数据的位置,此时j=0(j对应的值是8),8>1,于是向后移动,序列变为8,8,5,4,7,此时移动结束,然后序列的第j位等于temp,变为1,8,5,4,7;开始第三个数5,此时temp=5,j=1,由于8>5,向后移动序列变为1,8,8,4,7,此时j位替换成temp得到1,5,8,4,7;开始第四个数......(后面省略,对照下面代码,然后自己手写一下,会很清楚)
public static void InsertSort(int[] arr)
{
for (int i = 1; i < arr.Length; i++)
{
int j;//记录arr[i]该插入的位置
int temp = arr[i];//保留arr[i]的值
for (j = i-1; j >=0; j--)
{
if (arr[j] > temp)
{
arr[j+1] = arr[j];
}
else
{
break;
}
}
//退出循环时多减了1,要加回来
arr[j+1] = temp;
}
}
复杂度:平均是O(n^2)最好是O(n)。最好就是序列已经排好序,只做外层循环。
小结:这是几种比较基础的排序,理清每种排序的规则和原理很有必要。个人目前最喜欢选择排序,清晰明了。