/*有两种简单排序算法分别是插入排序和选择排序,两个都是数据量小时效率高。
实际中插入排序一般快于选择排序,由于更少的比较和在有差不多有序的集合表现更好的性能。
但是选择排序用到更少的写操作,所以当写操作是一个限制因素时它被使用到*/
算法:将数组分为两部分,一部分是已经排好顺序的,另一部分是未排序的。每次找数组后半部分中最小的一个元素排到前面的序列。
//选择排序 Best:n^2 Average:n^2 Worst:n^2 Memory:1 Stable:No
void SelectionSort(int* pDataArray, int iDataNum)
{
for (int i = 0; i < iDataNum - 1; i++) //从第一个位置开始
{
int index = i;
for (int j = i + 1; j < iDataNum; j++) //寻找最小的数据索引
if (pDataArray[j] < pDataArray[index])
index = j;
if (index != i) //如果最小数位置变化则交换
DataSwap(&pDataArray[index], &pDataArray[i]);
}
}
插入排序 Best:n Average:n^2 Worst:n^2 Memory:1 Stable:Yes
void insertSort(int *array, int len)
{
int i, j, temp;
for(i = 1; i < len; i ++)
{
temp = array[i];
for(j = i - 1; j >= 0; j --)
{
if(array[j] > temp) //找到合适位置插入
{
array[j + 1] = array[j]; //大于部分往后移动
}else
{
break;
}
}
array[j + 1] = temp;//插入新值temp,即array[i]
}
}
/*
1.3 插入排序与选择排序的区别
插入排序类似于选择排序,不同之处是插入排序是一个元素一个元素地往有序序列中插入,而选择排序则是在无序序列中选择最大(最小)
元素放入有序队列末尾。一个主要操作有序队列,一个则是无序队列。这样就导致选择排序每次都要遍历一次无序队列,而插入排序则不
需要遍历整个有序队列,只需要遍历到该元素应有的位置即可,这样就使得基本有序的队列的复杂度为O(n).
但同时这会导致插入排序用到更多的写操作,因为内部循环时他对数组进行大量的移位操作,大家知道移位操作对于数组是非常低效率的。
而选择排序因为每次添加元素都是添加在末尾,所以不需要移位操作。
*/