C で最も使いやすい配列ソート関数を探しています。誰かに少し C を教えるつもりです (実際、これらはすべての言語に共通の基本です)。Javaのようなint配列の関数はありますか
Arrays.sort(arr);
私は qsort を見てきましたが、私が見たように、追加の比較機能が必要です。
だから...関数を実装し、それで完了します...
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
関数が知る必要がある理由を説明します。
それは自然に比較関数自体につながります...型をキャストおよび逆参照する方法。
最後に、彼らが概念をよく理解している場合、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) );
最も簡単な方法は、最初の 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になる可能性があります.しかし、私はこの数を計算するのが面倒でした.教授は大丈夫でした. :-)
**これを読んでいると、並べ替えについてのアイデアが得られます**
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]);
}
}
}
}
教育目的でこれを行っているだけの場合は、に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);
}