1

我想自己实现 shellsort 而不是复制粘贴在线的,如果有人能帮助我找到错误并改进我愚蠢的 lil 代码,我将不胜感激我将把我的代码写在下面

#include <iostream>
#include <cmath>

using namespace std;

void swap(int p, int j, int *arr);
void shellSort(int arr[], int gap, int size);

int main() {
    int array[] = {12, 2, 4, 23, 5, 1, 6, 8, 16, 64, 32, 7, 43, 243, 76};
    int size = 15;
    for (int i = 15; i >= 1; i /= 2) {
        shellSort(array,i,size);
        cout << i << endl;
    }

    print(array, 15);
    // shellSortwhile(array, 15);
    print(array, 15);
}

void shellSort(int arr[], int gap, int size) {
    for (int i = 0; i < size; i += gap) {
        if (arr[i] > arr[i + gap]) {
            swap(i, i + gap, arr);
            for(int j = i; j >= 0; j -= gap) {
                if (arr[j] < arr[j - gap]) {
                    swap(j-gap, j, arr);
                }
            }
        }
    }
}

我的输出是:

Now the array will be printed
2
4
5
6
7
7
8
1076814756
12
15
16
23
32
43
64
4

2 回答 2

0
#include <iostream>
#include <cmath>
using namespace std;
void swap(int p, int j, int* arr );
void shellSortwhile(int arr[], int size);
void shellSort(int arr[], int gap,int size);
void print(int* arr, int size);
int main() {
    int array[]={12,2,4,23,5,1,6,8,16,64,32,7,43,243,76};
    int size=15;
    for (int i=size/2;i>=1;i/=2)#include <iostream>
#include <cmath>
using namespace std;
void swap(int p, int j, int* arr );
void shellSortwhile(int arr[], int size);
void shellSort(int arr[], int gap,int size);
void print(int* arr, int size);
int main() {
    int array[]={12,2,4,23,5,1,6,8,16,64,32,7,43,243,76};
    int size=15;
    print(array,15);
    for (int i=size/2;i>=1;i/=2)
   { shellSort(array,i,size);
    cout<<i<<endl;

   }
    print(array,15);
   // shellSortwhile(array,15);

}
void print(int* arr, int size)
{
    cout<<"Now the array will be printed"<<endl;
    for (int i=0;i<size;i++)
        cout<<arr[i]<<endl;
}
void swap(int p, int j, int* arr )
{
    int temp=arr[p];
    arr[p]=arr[j];
    arr[j]=temp;
}
void shellSortwhile(int arr[], int size) {
    int i, j, gap, temp;
    gap = size/2;

    while(gap > 0) {
        i = gap;

        while(i < size) {
            temp = arr[i];

for(j = i; (j >= gap) && (arr[j - gap] > temp); j -=gap) {
                arr[j] = arr[j - gap];
            }
            arr[j] = temp;
            i++;
        }
        gap = gap / 2;
    }
}


void shellSort(int arr[], int gap,int size)
{
    for (int i=0;i<size-(gap);i++)

    {
    if (arr[i]>arr[i+gap])
    {
        swap(i,i+gap,arr);

        for(int j=i;j>=0+gap;j-=gap)
        {if (arr[j]<arr[j-gap])
            swap(j-gap,j,arr);
        }
    }
    }
}
   { shellSort(array,i,size);
    cout<<i<<endl;

   }
    print(array,15);
   // shellSortwhile(array,15);
        print(array,15);

}
void print(int* arr, int size)
{
    cout<<"Now the array will be printed"<<endl;
    for (int i=0;i<size;i++)
        cout<<arr[i]<<endl;
}
void swap(int p, int j, int* arr )
{
    int temp=arr[p];
    arr[p]=arr[j];
    arr[j]=temp;
}
void shellSortwhile(int arr[], int size) {
    int i, j, gap, temp;
    gap = size/2;

    while(gap > 0) {
        i = gap;

        while(i < size) {
            temp = arr[i];

for(j = i; (j >= gap) && (arr[j - gap] > temp); j -=gap) {
                arr[j] = arr[j - gap];
            }
            arr[j] = temp;
            i++;
        }
        gap = gap / 2;
    }
}


void shellSort(int arr[], int gap,int size)
{
    for (int i=0;i<size-(gap);i++)

    {
    if (arr[i]>arr[i+gap])
    {
        swap(i,i+gap,arr);
        print(arr,size);

        for(int j=i;j>=0+gap;j-=gap)
        {if (arr[j]<arr[j-gap])
            swap(j-gap,j,arr);
             print(arr,size);
        }
    }
    }
}
于 2017-04-03T10:13:49.960 回答
0

您正在阅读/写作超出范围。i+gap在您的第一次迭代中是 15。您的数组中只有 15 个元素,因此您正在读取最后一个元素之后的一个元素。这是 C 语言中最常见的错误,不要为此感到难过!

于 2017-04-03T01:56:56.653 回答