做过几次topcoder上的小比赛,80%的题目都要用到排序,并且数据量比较少,只有几十条。这个时候,用vector和插入排序简直是既简单又合适,效率也不会很低,毕竟数据量太少。在实际的项目开发过程中,对效率有一定要求的还是比较少,这插入排序使用的频率自然就高了,毕竟,写一个满足需要的快速排序或者堆排序代码,那比插入排序麻烦的多。
既然用的这么多,我们就考虑一下在插入排序上的优化问题。先看一段最基本的插入排序代码:
- void insertion_sort(int list[], int n)
- {
- int i,j;
- int next;
- for(i=1; i<n; i++) {
- next = list[i];
- for(j=i-1; j>=0&&next<list[j]; j--)
- {
- list[j+1] = list[j];
- }
- list[j+1] = next;
- }
- }
- int compare(int a, int b) {
- return a<b?-1:a==b?0:1;
- }
- int binsearch(int list[],int searchnum, int left, int right)
- {
- int middle;
- while (left <= right) {
- middle = (left + right) / 2;
- switch(compare(searchnum,list[middle])) {
- case -1:
- right = middle -1;
- break;
- case 0:
- return middle;
- case 1:
- left = middle + 1;
- }
- }
- if (left>right) {
- return left;
- }
- else {
- return middle;
- }
- }
- void insertion_sort(int list[], int n)
- {
- int i,j;
- int next;
- for (i=1; i<n; i++) {
- next = list[i];
- int pos = binsearch(list,next,0,i-1);
- for (j=i-1; j>=pos; j--) {
- list[j+1] = list[j];
- }
- list[j+1] = next;
- }
- }