排序——插入排序法

来源:互联网 发布:网址导航手机版源码 编辑:程序博客网 时间:2024/04/26 18:31
插入排序法图示:
插入排序法自己实现的代码:
 
void insertion_sort(int array[], int first, int last){int index, temp, back;for(index = first+1; index <= last; index ++){temp = array[index];for(back = index-1; back >= 0 && temp < array[back]; back --)//1{array[back+1] = array[back];}if(back != index-1)//2{array[back+1] = temp;}}}
参考代码:
 void insertion_sort(int array[], int first, int last) { int i,j; int temp; for (i = first+1; i<=last;i++) { temp = array[i]; j=i-1;  //與已排序的數逐一比較,大於temp時,該數向後移 while((j>=first) && (array[j] > temp))  //当first=0,j循环到-1时,由于[[短路求值]],不会运算array[-1] { array[j+1] = array[j]; j--; }                array[j+1] = temp;//被排序数放到正确的位置  } }
自己的代码存在的问题:
//1位置:使用back >= 0作为判断条件,无形中对数组的范围做了假设。
//2位置:插入的位置都是这里,这个判断有点多余(虽然说有时候的赋值是没有实际意义的,比如temp比前面的值都大时),相比于判断语句和赋值语句,赋值语句执行效率更高。

插入排序算法的特点:
如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数减去(n-1)次。平均来说插入排序算法复杂度为O(n2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。 插入排序在工业级库中也有着广泛的应用,在STL的sort算法和stdlib的qsort算法中,都将插入排序作为快速排序的补充,用于少量元素的排序(通常为8个或以下)。
最差时间复杂度:O(n^2)
最优时间复杂度:O(n)
平均时间复杂度:O(n^2)
最差空间复杂度:O(n)(递归实现时),非递归实现时为O(1)
补充:如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。
0 0