[英]Error in implementing bubble sorting in a merge sort program in C
我正在學習數據結構和算法。 該程序采用數組中的一定數量的輸入,並使用歸並排序對它們進行排序。 條件是當子數組的大小等於或小於 10 時,它應該使用冒泡排序將元素排序,然后將它們合並在一起。 我的問題是讓程序進行冒泡排序。 到目前為止,我一直無法找出我的程序中的錯誤。 我還在每天學習。 如果有人能幫我找到錯誤並修復它,我將不勝感激。 非常感謝你,祝你有個愉快的一天。
這是代碼:
#include<stdio.h>
#include<stdlib.h>
#define arrsize 10
void merge_sort(int, int);
void merge_array(int, int, int, int);
int arr_sort[arrsize];
void bubblesort(int a[],int size);
void main()
{
int a[50],n,i;
printf("\nEnter %d Elements for Sorting\n", arrsize);
for (i = 0; i < arrsize; i++)
scanf("%d", &arr_sort[i]);
printf("\nYour Data :");
for (i = 0; i < arrsize; i++) {
printf("\t%d", arr_sort[i]);
}
merge_sort(0, arrsize - 1);
printf("\n\nSorted Data :");
for (i = 0; i < arrsize; i++) {
printf("\t%d", arr_sort[i]);
}
}
void bubblesort(int arr_sort[],int size)
{
int temp,i,j;
for(i=0;i<size;i++)
{
for(j=0;j<size-1;j++)
{
if(arr_sort[j]>arr_sort[j+1])
{
temp=arr_sort[j];
arr_sort[j]=arr_sort[j+1];
arr_sort[j+1]=temp;
}
}
}
}
void merge_sort(int i, int j) {
int m;
if (i < j) {
m = (i + j) / 2;
if(m<=5)
{
for(i=0;i<=m;i++){
for(j=i+1;j<=m;j++){
bubblesort(arr_sort[i],m);
bubblesort(arr_sort[j],m);}}
merge_array(i,m,m+1,j);
}
else
merge_sort(i, m);
merge_sort(m + 1, j);
merge_array(i, m, m + 1, j);
}
}
void merge_array(int a, int b, int c, int d) {
int t[50];
int i = a, j = c, k = 0;
while (i <= b && j <= d) {
if (arr_sort[i] < arr_sort[j])
t[k++] = arr_sort[i++];
else
t[k++] = arr_sort[j++];
}
while (i <= b)
t[k++] = arr_sort[i++];
while (j <= d)
t[k++] = arr_sort[j++];
for (i = a, j = 0; i <= d; i++, j++)
arr_sort[i] = t[j];
}
在您的代碼中的問題:
從merge_sort
,您應該為給定的樓層大小調用bubble_sort
,在您的merge_sort
硬固定,全局指定,或作為函數的參數。 前者最容易實現。
您從bubble_sort
調用的merge_sort
從一開始就是錯誤的,因為您在int*
應該存在的地方傳遞int
值。
你的函數應該都以數組排序作為參數,並且至少長度為好。 這使得函數更加健壯,並且由於指針運算,比您想象的更容易實現。
解決這個問題需要大手術。
更新了merge_array
首先對merge_array
函數進行一些手術。 這假設您支持可變長度數組 (VLA)。 請注意,該函數接受數組基址、中點和總長度。
void merge_array(int a[], int mid, int len)
{
// change to int tmp[arrsize], or use dynamic allocation, if your
// platform doesn't support VLAs
int tmp[len];
int i = 0, j = mid, k = 0;
while (i < mid && j < len)
tmp[k++] = ((a[i] < a[j]) ? a[i++] : a[j++]);
while (i < mid)
tmp[k++] = a[i++];
for (i = 0; i < k; ++i)
a[i] = tmp[i];
}
更新了merge_sort
現在merge_sort
函數如問題分析中所述。 像上面一樣,它應該接受一個數組基地址和一個長度,但這就是它所需要的。 指針算術將讓我們對遞歸調用進行分區。
void merge_sort(int a[], int len)
{
if (len < 5)
{
// bubblesort short partitions (less than length:5)
bubble_sort(a, len);
}
else
{
int mid = len / 2;
merge_sort(a, mid);
merge_sort(a + mid, len - mid); // note pointer arithmetic here
merge_array(a, mid, len);
}
}
更新bubble_sort
這個簡單的冒泡排序使用前向交換檢測提前離開已經排序的檢測。 像前面的函數一樣,我們有一些數組的基地址和指定的長度。
void bubble_sort(int a[], int size)
{
int swapped = 1;
while (swapped && size-- > 0)
{
swapped = 0;
for (int i = 0; i < size; ++i)
{
if (a[i + 1] < a[i])
{
int tmp = a[i];
a[i] = a[i + 1];
a[i + 1] = tmp;
swapped = 1;
}
}
}
}
把它放在一起
下面是完整的程序,其中包括將數組轉儲到控制台的打印助手,以及避免冗長的鍵盤輸入的隨機生成器。 提供的main()
創建一個隨機填充的數組,打印它,排序它,然后打印結果。 顯然,每次運行的輸出都會有所不同,但您希望了解上述函數的調用方式。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define arrsize 40
void merge_sort(int a[], int len);
void merge_array(int a[], int mid, int len);
void bubble_sort(int a[], int size);
void merge_array(int a[], int mid, int len)
{
// change to int tmp[arrsize], or use dynamic allocation, if your
// platform doesn't support VLAs
int tmp[len];
int i = 0, j = mid, k = 0;
while (i < mid && j < len)
tmp[k++] = ((a[i] < a[j]) ? a[i++] : a[j++]);
while (i < mid)
tmp[k++] = a[i++];
for (i = 0; i < k; ++i)
a[i] = tmp[i];
}
void merge_sort(int a[], int len)
{
if (len < 5)
{
// bubblesort short partitions (less than length:5)
bubble_sort(a, len);
}
else
{
int mid = len / 2;
merge_sort(a, mid);
merge_sort(a + mid, len - mid); // note pointer arithmetic here
merge_array(a, mid, len);
}
}
void bubble_sort(int a[], int size)
{
int swapped = 1;
while (swapped && size-- > 0)
{
swapped = 0;
for (int i = 0; i < size; ++i)
{
if (a[i + 1] < a[i])
{
int tmp = a[i];
a[i] = a[i + 1];
a[i + 1] = tmp;
swapped = 1;
}
}
}
}
void print_arr(int const arr[], int len)
{
while (len-- > 0)
printf("%d ", *arr++);
fputc('\n', stdout);
}
int main()
{
srand((unsigned)time(NULL));
int arr_sort[arrsize];
// generate random array
for (int i = 0; i < arrsize; ++i)
arr_sort[i] = 1 + rand() % 99;
print_arr(arr_sort, arrsize);
// sort the array
merge_sort(arr_sort, arrsize);
print_arr(arr_sort, arrsize);
}
樣本輸出
16 81 73 86 87 66 14 93 19 13 62 32 70 56 29 88 20 21 7 27 70 46 72 42 95 83 24 2 5 43 67 79 8 18 82 39 81 56 56 45
2 5 7 8 13 14 16 18 19 20 21 24 27 29 32 39 42 43 45 46 56 56 56 62 66 67 70 70 72 73 79 81 81 82 83 86 87 88 93 95
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.