我正在寻找在 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
函数需要知道:
这自然会导致比较函数本身......如何转换和取消引用类型。
最后,如果他们很好地掌握了这些概念,您可以指出第四个参数 toqsort
并不是特例。您可以说拥有一个指向函数的指针并将其作为参数传递给另一个函数是完全可以的。这一切都是为了让指针的类型正确,然后编译器会为你整理出剩下的部分。
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) 次迭代中完成,但我不知道如何计算确切的迭代次数,所以为了确保对所有元素进行排序,我以这种方式制作了它。
如果您愿意,您可以通过知道在每次迭代中对一个元素进行排序来减少迭代次数,第二个循环也可以从 0 变为 Ni-1。但是我懒得计算这个数字,而且教授还可以:-)
如果您只是出于教学目的而这样做,为什么不根据 编写自己的易于使用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);
}
**如果您正在阅读本文,您将对排序有所了解 **
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]);
}
}
}
}