2

C で最も使いやすい配列ソート関数を探しています。誰かに少し C を教えるつもりです (実際、これらはすべての言語に共通の基本です)。Javaのようなint配列の関数はありますか

Arrays.sort(arr);

私は qsort を見てきましたが、私が見たように、追加の比較機能が必要です。

4

4 に答える 4

7

だから...関数を実装し、それで完了します...

int compare_int( const void* a, const void* b )
{
    if( *(int*)a == *(int*)b ) return 0;
    return *(int*)a < *(int*)b ? -1 : 1;
}

const size_t num_elem = 10;
int elements[num_elem] = { 3, 6, 1, 9, 8, 2, 0, 5, 7, 4 };
qsort( elements, num_elem, sizeof(int), compare_int );

これで、並べ替えに関するレッスンは「これはどのように機能するか」になりますか?

まず、メモリのレイアウトと配列について説明します。とにかくこれを知るまで、Cでは多くのことを行うことはできません。

void次に、ポインタとは何か、qsort関数が知る必要がある理由を説明します。

  1. 配列の開始アドレス
  2. 要素の数
  3. 各要素のサイズ
  4. 要素を比較する方法

それは自然に比較関数自体につながります...型をキャストおよび逆参照する方法。

最後に、彼らが概念をよく理解している場合、4番目のパラメーターqsortは特殊なケースではないことを指摘できます。関数へのポインタを持っていて、それをパラメータとして別の関数に渡すことはまったく問題ないと言えます。ポインタのタイプを正しく取得することがすべてです。その後、コンパイラが残りを分類します。

int (*comparator)(const void*, const void*) = compare_int;
int a = 1, b = 2;
printf( "comparator(%d, %d) = %d\n", a, b, comparator(&a, &b) );
于 2012-11-18T23:48:45.310 に答える
2

最も簡単な方法は、最初の C プログラミング コースで、オンラインでアルゴリズムを検索せずに次のように記述したことです。

for(int i=0; i<N;i++)
{
    for(int j=0;j<N-1;j++)
    {
        if(array[j]<array[j+1])
        {
            int temp=array[j];
            array[j]=array[j+1];
            array[j+1]=temp;
        }
    }
}

N*(N-1) 回未満の反復で作成できることはわかっていましたが、正確な反復回数を計算する方法がわからなかったので、すべての要素を確実に並べ替えるために、この方法で作成しました。
必要に応じて、反復ごとに1つの要素がソートされることを知ることで、反復の数を減らすことができます.2番目のループは0からNi-1になる可能性があります.しかし、私はこの数を計算するのが面倒でした.教授は大丈夫でした. :-)

于 2012-11-19T00:02:52.860 に答える
0

**これを読んでいると、並べ替えについてのアイデアが得られます**

package com.alindal.sort;
import java.util.Scanner;

public class Sort {

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        int[] numers;
        System.out.println("Enter the number of elements: ");

        Scanner n=new Scanner(System.in);
        int x=n.nextInt();
        int[] srt=new int[10];
        for(int i=0;i<x;i++)
        {
            srt[i]=n.nextInt();
            }


        System.out.println("The sorted numbers :");
        for(int i=0;i<x-1;i++)
        {
            for(int j=i+1;j<x;j++)
            {

                if(srt[i]>srt[j])
                {
                    int temp=srt[i];
                    srt[i]=srt[j];
                    srt[j]=temp;

                }
                else{
                    srt[i]=srt[i];
                srt[j]=srt[j];
            }

        }

        for(i=0;i<x;i++)
        {
        System.out.println(srt[i]);
        }
        }
    }
}
于 2016-08-03T08:13:30.517 に答える
0

教育目的でこれを行っているだけの場合は、にsort()基づいて独自の使いやすいものを作成してみませんqsort()か? 探しているほど単純な標準関数はないため、独自の関数を実装するのが最善の選択肢です。

int compare(const void *a, const void *b) {
    return (*(int *)a > *(int *)b) - (*(int *)a < *(int *)b);
}

void sort(int *arr, size_t len) {
    qsort(arr, len, sizeof(int), compare);
}
于 2012-11-19T00:00:55.370 に答える