数组中的最小差异

时间:2012-09-20 02:40:52

标签: c++ algorithm

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

#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 个答案:

答案 0 :(得分:3)

您使用的是C ++,而不是使用自定义快速排序,而不是真正保证O(n * logn),您最好使用<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;

答案 1 :(得分: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的情况下也这样做。

答案 2 :(得分: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;
  }
}

答案 3 :(得分: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; }