//直接插入排序 1 void Insertsort1(int a[],int n) { int i,j; int tmp; for(i=1;i<n;i++) { if(a[i] < a[i-1]) //如果当前所要插入的数比已排序好的最大的数大 //则不需要再进行比较,直接放到当前位置 { tmp = a[i]; for(j=i-1;j>=0;j--) { if(a[j] > tmp) a[j+1] = a[j]; //将比tmp的值往后排 else break; } a[j+1] = tmp; //找到合适的位置 } } } //别人博客上写得更加精简 void Insertsort2(int a[], int n) { int i, j; for (i = 1; i < n; i++) if (a[i] < a[i - 1]) { int temp = a[i]; for (j = i - 1; j >= 0 && a[j] > temp; j--) a[j + 1] = a[j]; a[j + 1] = temp; } } //直接插入排序2 交换顺序,而非将比tmp的值往后放 void Insertsort3(int a[],int n) { int i,j; for(i=1;i<n;i++) { if(a[i] < a[i-1]) //如果当前所要插入的数比已排序好的最大的数大 //则不需要再进行比较,直接放到当前位置 { for(j=i-1;j>=0;j--) { if(a[j] > a[j+1]) Swap(a[j],a[j+1]); else break; } } } }
复杂度:因为两层for循环嵌套,故为O(n^2);
稳定性:稳定。因为a[j]>tmp,即只有比tmp大的才往后移动,和他相等并不往后移动。