1

我想找到数组的所有元素之间的最小差异。我通读了其他各种问题,但在以下代码中找不到错误的确切来源。

#include<iostream>
#include<stdio.h>
#include<cstdlib>

using namespace std;

void quicksort(long int *lp, long int *rp);

int main()
{
    int t,n;
    long int s[5000];

    cin>>t;
    while(t--){
    cin>>n;
    for(int i=0;i<n;i++) cin>>s[i];
    quicksort(&s[0],&s[n-1]);
    //cout<<"passes:"<<passes<<endl;
    //for(int i=0;i<n;i++) cout<<s[i]<<" ";
    long int min = abs(s[1]-s[0]);
    //cout<<endl<<min;
    for(int i=1;i<(n-1);i++){
        long int temp = abs(s[i]-s[i+1]);
        if (temp <= min) min = temp;
    }
    cout<<min;
    }
}

void quicksort(long int *lp,long int *rp){
    int arraysize= (rp-lp)+1;
    if(arraysize > 1){
       long int *pivot = (lp+(arraysize/2));
       long int swap=0;
      long int *orgl = lp;
      long int *orgr = rp;
      while(lp!=rp){
        while (*lp < *pivot) lp++;
        while (*rp > *pivot) rp--;
        if (lp == pivot) pivot=rp;
        else if (rp == pivot) pivot=lp;
        swap = *lp;
        *lp = *rp;
        *rp = swap;
        if((*lp == *pivot) || ( *rp == *pivot)) break;
    }
    quicksort(orgl,pivot-1);
    quicksort(pivot+1,orgr);
}

}

问题陈述在这个链接中给出:http: //www.codechef.com/problems/HORSES 你能找出我程序中的错误吗?

4

4 回答 4

3

您正在使用 C++,所以不要使用不能真正保证 O(n*logn) 的自定义快速排序,您最好使用 sort from <algorithm>。这个逻辑看起来不错:

    long int min = abs(s[1]-s[0]);
    //cout<<endl<<min;
    for(int i=1;i<(n-1);i++){
        long int temp = abs(s[i]-s[i+1]);
        if (temp <= min) min = temp;
    }

By the way: 
cout<<min; 
Add cout<<min << endl;
于 2012-09-20T04:05:15.087 回答
0

线

if((*lp == *pivot) || ( *rp == *pivot)) break;

是错的。考虑

5 4 7 5 2 5
      ^
    pivot

哎呀。

这条线

long int temp = abs(s[i]-s[i+1]);

是不必要的复杂。由于数组(据说)是排序的,

long int temp = s[i+1] - s[i];

不调用abs.

于 2012-09-20T04:09:03.340 回答
0
sort(s, s + n); // #include <algorithm> O(n*log n)

否则排序/查找最小算法是正确的。有基于随机化、桶排序的 O(n) 算法。

#include <algorithm> // sort()
#include <iostream>

int main() {
  using namespace std;
  int ntests, n;
  const int maxn = 5000; // http://www.codechef.com/problems/HORSES
  int s[maxn];
  cin >> ntests; // read number of tests
  while (ntests--) {
    cin >> n; // read number of integers
    for (int i = 0; i < n; ++i) cin >> s[i]; // read input array

    sort(s, s + n); // sort O(n*log n)
    // find minimal difference O(n)
    int mindiff = s[1] - s[0]; // minn = 2
    for (int i = 2; i < n; ++i) {
      int diff = s[i] - s[i-1];
      if (diff < mindiff) mindiff = diff;
    }
    cout << mindiff << endl;
  }
}
于 2012-09-20T04:12:44.493 回答
0
#include <iostream> using namespace std;

int main() {
    int a[] = {1,5,2,3,6,9};
    int c=0;
    int n = sizeof(a)/sizeof(a[0]);
    for(int i=0;i<n-1;i++){
        for(int j=i+1;j<n;j++){
            cout<<a[i]<<" - "<<a[j]<<" = "<<a[i]-a[j]<<endl;
            if(abs(a[i]-a[j]) == 2)
                c++;
        }
    }
    cout<<c<<endl;
    return 0; }
于 2020-09-24T15:55:20.320 回答