插入排序变体

Insertion Sort Variation

本文关键字:插入排序      更新时间:2023-10-16
#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 − 1)st 元素进行比较,然后根据需要将第 j 个元素与 (j − 2) 个元素进行比较,依此类推。

所以它说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

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

          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;