插入排序变化

时间:2013-10-07 03:41:15

标签: c++ sorting

#include <iostream>
using namespace std;


void print_array(int array[], int size)
{
    cout<< "insertion sort steps: ";
    int j;
    for (j=0; j<size;j++)
        cout <<" "<< array[j];
    cout << endl;
}

void insertion_sort(int a[], int n)
{

    int i;
       for(int j = 1; j < n; j++) {
          i = 0;
          while ((a[j] > a[i])) {
            i = i+1;
          }
          int m = a[j];
          for(int k = 0; k <= (j-i-1); k++) {
            a[j-k] = a[j-k-1];

          }
          a[i] = m;
          print_array(a,n);
       }
}

int main() {
    int array[6]= {3,2,4,5,1,6};
    insertion_sort(array,6);
    return 0;
}

我试图修改这个插入排序,它使用线性搜索技术,通过首先将第j个元素与(j-1)st元素进行比较,然后将第(j-1)个元素与第j个元素进行比较,将第j个元素插入到正确的位置必要时可以使用元素,等等。

所以i = 0;说它应该是i = j-1;

我的尝试:

void insertion_sort(int a[], int n)
{

    int i;
       for(int j = 1; j < n; j++) {
          i = j-1;
          while ((a[j] > a[i]) && (i > 0)) {
            i = i-1;
          }
          int m = a[j];
          for(int k = (j-i-1); k >= 0; k--) {
            a[j-k] = a[j-k-1];

          }
          a[i] = m;
          print_array(a,n);
       }
}

这是输出

insertion sort steps:  2 3 4 5 1 6
insertion sort steps:  4 2 2 5 1 6
insertion sort steps:  5 4 4 4 1 6
insertion sort steps:  5 4 4 1 4 6
insertion sort steps:  6 5 5 5 5 5

第一步是第二步工作正确,一切都开始失败。

1 个答案:

答案 0 :(得分:0)

          while ((a[j] > a[i]) && (i > 0)) {
            i = i-1;
          }

是错误的,因为如果a[j]不被移动,它会导致0插入索引a[j]。将其更改为

          while (0 <= i && a[j] < a[i]) --i;
          ++i;

此外,移位循环错误且复杂 - 将其更改为

          int m = a[j];
          for (int k = j; k > i; k--) a[k] = a[k-1];
          a[i] = m;