給定N個(長整型范圍內的)整數,要求輸出從小到大排序后的結果。
本題旨在測驗各種不同的排序演算法在各種資料情況下的表現。各組測驗資料特點如下:
資料1:只有1個元素;
資料2:11個不相同的整數,測驗基本正確性;
資料3:103個隨機整數;
資料4:104個隨機整數;
資料5:105個隨機整數;
資料6:105個順序整數;
資料7:105個逆序整數;
資料8:105個基本有序的整數;
資料9:105個隨機正整數,每個數字不超過1000。
輸入格式:
輸入第一行給出正整數N(≤10
?5
?? ),隨后一行給出N個(長整型范圍內的)整數,其間以空格分隔。
輸出格式:
在一行中輸出從小到大排序后的結果,數字間以1個空格分隔,行末不得有多余空格。
輸入樣例:
11
4 981 10 -17 0 -20 29 50 8 43 -5
輸出樣例:
-20 -17 -5 0 4 8 10 29 43 50 981
我寫了一個歸并排序的代碼,這些代碼直接運行的話沒有問題, 但是當我在 hebin函式里的k=0; i=left; j=center+1;設定斷點, 不斷下一步的時候, 程式有時會崩潰, 有時會輸出錯誤的結果, 然后我觀察這個函式內各個變數的變化,發現根本不按照我寫的程式變化啊,這是為什么啊??
總的來說, 就是這段代碼直接運行沒有問題, 當在某處設定斷點后, 再進行除錯, 不斷點擊下一步就會出現問題。
大家可以拿
3
3 2 1
試一下。c語言小白, 大神們幫幫我吧。
#include <stdio.h>
void sort(int *a, int left, int right);
void merge(int *a, int left, int center, int right);
int main(){
int n, i;
scanf("%d", &n);
int number[n];
for(i=0;i<n;i++)scanf("%d", &number[i]);
sort(number, 0, n-1);
printf("%d", number[0]);
for(i=1;i<n;i++)printf(" %d", number[i]);
return 0;
}
void sort(int *a, int left, int right){
if(left==right)return;
int center;
center=(left+right)/2;
sort(a, left, center);
sort(a, center+1, right);
merge(a, left, center, right);
}
void merge(int *a, int left, int center, int right){
int i, j, k;
k=0; i=left; j=center+1;
int n=right-left+1;
int re[n];
while(1){
if(a[i]<a[j]){
re[k++]=a[i++];
if(i==center+1)break;
}else {
re[k++]=a[j++];
if(j==right+1)break;
}
}
if(i==center+1){
for(;j<right+1;j++)re[k++]=a[j];
}else{
for(;i<center+1;i++)re[k++]=a[i];
}
for(i=0,j=left;i<n;){
a[j++]=re[i++];
}
}
uj5u.com熱心網友回復:
#include <stdio.h>
#include <stdlib.h>
void sort(int *a, int left, int right);
void merge(int *a, int left, int center, int right);
int main()
{
int n, i;
scanf("%d", &n);
int *number;
number = (int *)malloc(sizeof(int) * n);
if (!number)
return -1;
for(i=0;i<n;i++)
scanf("%d", &number[i]);
sort(number, 0, n-1);
//printf("%d", number[0]);
//for(i=1;i<n;i++)
for(i=0;i<n;i++)
printf(" %d", number[i]);
free(number);
return 0;
}
void sort(int *a, int left, int right)
{
if(left==right)return;
int center;
center=(left+right)/2;
sort(a, left, center);
sort(a, center+1, right);
merge(a, left, center, right);
}
void merge(int *a, int left, int center, int right)
{
int i, j, k;
k=0; i=left; j=center+1;
int n=right-left+1;
//int re[n];
int *re;
re = (int *)malloc(sizeof(int) * n);
if (!re)
exit(0);
while(1){
if(a[i]<a[j]){
re[k++]=a[i++];
if(i==center+1)break;
}else {
re[k++]=a[j++];
if(j==right+1)break;
}
}
if(i==center+1){
for(;j<right+1;j++)re[k++]=a[j];
}else{
for(;i<center+1;i++)re[k++]=a[i];
}
for(i=0,j=left;i<n;){
a[j++]=re[i++];
}
free(re);
}
供參考~
測驗了暫未發現問題~樓主可以多測測驗試~
uj5u.com熱心網友回復:
感謝回復,我用您的代碼測驗了下,會出現同樣的問題。也就是說,如果我直接運行程式的話沒有問題,但如果我在您發的程式的第42行設定了一個斷點, 再點擊下一步的時候, 這個k的值并不是0, k有時會等于1, 有時等于2, 也有時會正常等于0。當k并沒有等于0的時候, 后續的k++也并不會讓k每次加一, k會無規律往上增長, 甚至有時我并沒有點擊下一步(我只是盯著螢屏看, 沒有進行任何操作), k值也會往上增長。。。這種情況就會輸出錯誤的結果, 或者程式崩潰。。您可以再42行設定斷點試一下, 不會只有我出現這種情況吧
。重點說明,程式可以正常運行, 只有當某處設定了斷點后就會出現奇怪的狀況。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/244931.html
標籤:C語言
下一篇:萌新求教啊
