我正在尝试遵循以下条件的2种方式插入排序:
但是我无法从两边获得越来越大的元素。您的建议将不胜感激
我尝试使用2个数组。假设a
和b
是2个数组。我将a[0]
放置在b[mid]
中,其中mid
是数组b
的中间元素,并将数组a
的所有元素与b[mid]
进行了比较,并尝试递增和递减。
我现在面临的问题是,如果我将输入设为5 6 7 4 3
,则输出将变成3 4 5 6 7
。但是,如果我将输入交换为5 7 6 3 4
,则输出将为0 3 5 7 0
。它超出范围了。我希望这是我没有得到的排序数组。任何人都可以帮助我,如何将逻辑用于排序以及不超出范围。
#include <stdio.h>
void main() {
int a[20] = { 0 };
int b[20] = { 0 };
int mid1, mid2, n, i, low, high;
printf("\nEnter Size of the array:\n");
scanf("%d", &n);
printf("Enter Array elements");
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
printf("Elements before sorting:");
for (i = 0; i < n; i++) {
printf("%d\t", a[i]);
}
low = 0;
high = n;
mid1 = (low + high) / 2;
mid2 = (low + high) / 2;
b[mid1] = a[0];
printf("\n The middle element is : %d", b[mid1]);
for (i = 1; i < n; i++) {
if (a[i] <= b[mid1]) {
mid1 = mid1 - 1;
b[mid1] = a[i];
}
}
b[mid2] = a[0];
for (i = 1; i < n; i++) {
if (a[i] > b[mid2]) {
mid2 = mid2 + 1;
b[mid2] = a[i];
}
}
printf("\nSecond array is :");
for (i = 0; i < n; i++) {
printf("%d\t", b[i]);
}
}
答案 0 :(得分:0)
您的算法无效:
b
边界的元素。b
中有2个元素,任何其他值在这2个元素之间的元素将根本不会存储到b
中。插入排序通常是在原地执行的,但是这是代码的修改版本,可以在b
中生成带有插入排序变体的排序数组:
#include <stdio.h>
int main() {
int a[20], b[20];
int n, i, j;
printf("Enter Size of the array: ");
if (scanf("%d", &n) != || n < 1 || n > 20)
return 1;
printf("Enter Array elements: ");
for (i = 0; i < n; i++) {
if (scanf("%d", &a[i]) != 1)
return 1;
}
printf("Elements before sorting:");
for (i = 0; i < n; i++) {
printf("\t%d", a[i]);
}
printf("\n");
b[0] = a[0];
for (i = 1; i < n; i++) {
int t = a[i];
for (j = i; j > 0 && dest[j - 1] > t; j--) {
b[j] = b[j - 1];
}
b[j] = t;
}
printf("Sorted array is:");
for (i = 0; i < n; i++) {
printf("\t%d", b[i]);
}
printf("\n");
return 0;
}