【总结】
其实理解这个直接选择排序的时候我犯了一个错误,那就是我缘来一直认为当只要选择出来一个比较大(小)的值就进行交换位置,但是后来在理解他的思路的时候发现其实他应该先所有的数值都比较完之后再进行交换,而且我一直将冒泡排序和选择排序弄混,其实两者有本质的区别!
【内容】
1.直接选择排序的精髓之处是将自己比作最大(小)的;先比较完一趟再交换;
冒泡排序在每一次的比较中直接进行交换
2.****直接算法的思想用如下的动态图表示:
/// <summary>
/// 选择排序算法从小到大进行排序-2016-10-3 10:56:09
/// </summary>
/// <param name="a">待排序的数组</param>
/// <param name="n">数组的长度</param>
static void SelectSorting(int[] a, int n) {
int min=0, temp=0;
n = a.Length - 1;
for (int i = 0; i <n-1; i++)
{
//1.假定最小的索引值
min = i;
for (int j = i+1; j <=n; j++)
{
//2.选择出最小的索引!
if (a[j] < a[min])
{
min = j;
}
}
//3.将选择出来的最小的值和缘来假定的值交换位置!
if(min!=i)
{
temp = a[min];
a[min] = a[i];
a[i] = temp;
}
}
*****冒泡排序的动态图表示
/// <summary>
/// 冒泡排序的算法-2016-10-9 20:12:55
/// </summary>
/// <param name="a"></param>
/// <param name="n"></param>
/// <returns></returns>
static int BuddleSort(int[] a, int n) {
int temp = 0;
int endsort; //&&交换的标记
int count=0;
for (int i = 0; i < n; i++)
{
endsort = 0;
for (int j = 0; j < n-i; j++)
{
if (a[j]>a[j+1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
endsort = 1;
}
count++;
}
if (endsort == 0)
{
break;
}
}
return count;
}
*******两者之前更为抽象的区别:冒泡排序从后开始沉底,选择排序从头开始有序!
【总结】
对于比较简单的排序方法:直接插入,直接选择,冒泡排序的时间复杂度都是O(n^2),但是在于基本有序的情况下,我们一般都会选择直接插入,冒泡排序!而且这三种简单的方法中,选择排序是不稳定!算法只有在比对中,合适的情况下发挥它的作用!