C:按降序对矢量元素进行排序

时间:2015-01-23 22:09:37

标签: c arrays sorting vector

我正在尝试创建一个重新排列数组的函数,使其按降序排列。该数组由正整数组成,没有两个相等的元素。这就是我所拥有的:

int check (int *v, int n){
int i;
for (i=0; i<n; i++){
    if (v[i] != -1){
        return -1;
        break;
    }
    else return 1;
}
}

void sortVector (int *v, int n){
    int i, k, j=0, vp[n];

while (check(v,n) == -1){   
    for (i=0; i<n; i++){
        for (k=i+1; k<n; k++){
            if (v[k] > v[i]) break;
            else if (k == n-1){
                vp[j] = v[i];
                v[i] = -1;
                j++;
            }               
        }
    }
}

for (i=0; i<n; i++)
    v[i] = vp[i];
}

哪个无效。过去一周我一直在考虑这个问题,所以一些指针会很棒。感谢。

4 个答案:

答案 0 :(得分:0)

有很多用于排序的算法。一个简单的算法是找到数组中的最小元素,并将其放在第一个位置,方法是将它与第一个位置的任何项目交换,然后递归排序数组,但这次从下一个位置开始。

void sort(int a[], int l, int r)
{   if(l == r) return; /* 1-elemnt array is already sorted */

    int min = l;
    for(int i = l+1; i <= r; i++)
    {   if(a[i] < a[min])
        {   min = i;
        }
    }

    swap(a[l], a[min]);
    sort(a, l+1, r);
}

你也可以迭代地做。

答案 1 :(得分:0)

或许,意图如下

int check (int *v, int n){
    int i;
    for (i=0; i<n; i++){
        if (v[i] != -1){
            return -1;
            //break;  //This code that does not reach
        }
        //else return 1;  //move to after for-loop
    }
    return 1;
}

void ordenaVetor (int *v, int n){
    int i, k, j=0, vp[n];

    while (check(v,n) == -1){
        for (i=0; i<n; i++){
            if(v[i]<0) continue;//Element of -1 excluded. v[k] too.
            for (k=i+1; k<n; k++){
                if (v[k]>=0 &&  v[i] < v[k]) break;
            }
            if (k == n){
                vp[j] = v[i];
                v[i] = -1;
                j++;
                break;//start over
            }
        }
    }

    for (i=0; i<n; i++){
        v[i] = vp[i];
    }
}

答案 2 :(得分:0)

我尝试按照您在评论中说明的想法,从上面的代码开始并做了一些更改,这是最后两个函数

#include <stdio.h>

int check (int *v, int n)
{
    int i;
    for (i=0; i<n; i++)
    {
        if (v[i] != -1)
        {
            return -1; // break is useless because return has the same effect 
        }
    }
    return 1; // you need to add a return here to handle all the cases
              // the case if the loop is not entered you need to return a value 
}

void sortVector (int *v, int n)
{
    int i, k, j=0, vp[n];
    int maxIndex=0;//you need to add this variable in order to keep track of the maximum value in each iteration

    while (check(v,n) == -1)
    {
        for (i=0; i<n; i++)
        {
            maxIndex=i; //you suppose that the maximum is the first element in each loop 
            for (k=i+1; k<n; k++)
            {
                if (v[k] > v[maxIndex])
                  maxIndex=k; // if there is another element greater you preserve its index in the variable 
            }
           //after finishing the loop above you have the greatest variable in the array  which has the index stored in maxIndex
                    vp[i] = v[maxIndex]; // put it in vp array
                    v[maxIndex]=v[i];//put it in treated elements zone
                    v[i]=-1;// make it -1
                    j++;
        }
    }

    for (i=0; i<n; i++)
        v[i] = vp[i];
}

这是测试

int main()
{
    int tab[]= {1,152,24,11,9};
    sortVector (tab, 5);
    int i=0;
    for(i=0; i<5; i++)
    {
        printf("%d ",tab[i]);
    }
    return 0;
}

给出了所需的输出

152 24 11 9 1

注意:您可以通过在同一个数组上进行交换而不是分配另一个数组来改进代码!

答案 3 :(得分:-1)

您可以使用现有的排序实现,而不是重新发明轮子:

#include <stdlib.h>

int desc(void const *a, void const *b)
{
    if ( *(int *)a < *(int *)b ) return 1;
    return -1;
}

void sortVector (int *v, int n)
{
    qsort(v, n, sizeof *v, desc);
}