代碼如下:
#include<stdio.h>
#include<stdlib.h>
int a[100000];
void QuickSort(int a[],int p,int r);
int Partition(int a[],int p, int r);
void Swap(int a[],int i,int j);
int main() {
int N,m,i;
scanf("%d",&N);
for(i=0;i<N;i++){
scanf("%d",&m);
a[i] = m;
}
QuickSort(a,0,N-1);
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
void swep(int a[],int i,int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
int Partition(int a[], int p, int r) {
int i = p;
int j = r+1;
int key = a[p];
while(1) {
while(a[--j]>key && i < r);
while(a[++i]<key);
if (i >= j)
break;
swep(a,i,j);
}
a[p] = a[j];
a[j] = key;
return j;
}
void QuickSort(int a[],int p,int r) {
if(p<r) {
int pos = Partition(a,p,r);
QuickSort(a,p,pos-1);
QuickSort(a,pos+1,r);
}
}
uj5u.com熱心網友回復:
int a[100000];這個陣列定義是否有點大了,弄小點試試
uj5u.com熱心網友回復:
但是題目要求陣列元素個數n<100000uj5u.com熱心網友回復:
while(a[--j]>key && i < r); //@1while(a[++i]<key); //@2
改成
while(a[--j]>key ){ if(j == p)break; }
while(a[++i]<key) { if(i == r) break; }
=========
首先@1, 兩個地方不對:分析如下
1.因為是對j, 自減,你要防止j 越界,這里不是判斷i < r, 應該是i要大于等p,不能超過左邊界
2.就算是改成這樣while(a[--j] > key && j >= p;這樣呢 ?你認為OK了嗎?
還是有問題的,假設j==p,這時候while還會繼續走一次, 下一次 whlie條件走了前面一半,(a[--j] > key), j又越界了
那么改成 while(a[--j] > key && j >p); 如何? OK了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/98844.html
標籤:C語言
上一篇:能不能說說什么意思啊
下一篇:使用openmp對陣列求和
