“已排序”的确切含义

时间:2015-09-15 13:30:56

标签: c sorting

对于家庭作业,我必须编写一个函数,如果作为参数传递的数组已经排序,则返回该函数:

int    ft_is_sorted(int *tab, int length, int (*f)(int, int))
{
    //My code
}

我的问题是:“排序”是什么意思?

我的第一直觉是说[10, 8, 3, 1][1, 3, 8, 10]都已排序。但是当我检查http://www.cplusplus.com/reference/algorithm/is_sorted/时,我在这里看到他们认为数组只有在升序时才会排序。

我不想在一般情况下就排序的含义展开任何争论,但如果排序在编程中具有特殊含义,请告诉我!

4 个答案:

答案 0 :(得分:4)

您的作业很可能希望您将该功能用作对要编写的排序功能的验证。在此上下文中,“排序”表示“排序函数的可接受输出”。

如果你必须编写一个排序函数,你很可能不会随机编写一个按升序或降序排序的函数。所以匹配。

我们还没有看到你的作业,但是除非另有说明,否则我们在这里做的是假定升序。

答案 1 :(得分:3)

对于某些比较函数,每个序列都可以被视为“已排序”。

您需要弄清楚需要应用哪种比较功能。最好在您的实现中,您可以将其保留为用户提供的回调。

答案 2 :(得分:2)

对于C语言

传递给函数的函数指针用作比较函数。

通常,比较函数的设计是为了使ij两个索引i<j f(tab[i], tab[j]) < 0tab[i]如果tab[j]f {1}}位于比较函数定义的顺序中。

例如int f(int a, int b) { return b-a; } 可以实现为:

int f(int a, int b) { return a-b; }

按降序排序。并实施为:

a

升序排序。

参考

所有语言

所有编程语言都没有关于如何定义比较函数的全局约定。

  • C ++使用一个返回布尔值的函数,该函数定义b [MonoDroid] UNHANDLED EXCEPTION: [MonoDroid] System.AggregateException: One or more errors occurred. ---> System.FormatException: String was not recognized as a valid DateTime. [MonoDroid] at System.DateTimeParse.ParseExact (System.String s, System.String format, System.Globalization.DateTimeFormatInfo dtfi, DateTimeStyles style) [0x00027] in /Users/builder/data/lanes/2058/58099c53/source/mono/external/referencesource/mscorlib/system/globalization/datetimeparse.cs:57 [MonoDroid] at System.DateTime.ParseExact (System.String s, System.String format, IFormatProvider provider) [0x00000] in /Users/builder/data/lanes/2058/58099c53/source/mono/external/referencesource/mscorlib/system/datetime.cs:1083 [MonoDroid] at Parse.ParseClient.ParseDate (System.String input) [0x0000b] in :0 [MonoDroid] at Parse.ParseObject.MergeMagicFields (IDictionary 2 data) [0x000a4] in <filename unknown>:0 [MonoDroid] at Parse.ParseObject.MergeFromServer (IDictionary 2 data) [0x0001a] in :0 [MonoDroid] at Parse.ParseObject.MergeAfterSave (IDictionary 2 result) [0x0003a] in <filename unknown>:0 [MonoDroid] at Parse.ParseObject+<>c__DisplayClass2a.<SaveAsync>b__26 (System.Threading.Tasks.Task 1 t) [0x0004c] in :0 [MonoDroid] at System.Threading.Tasks.ContinuationResultTaskFromResultTask2[System.Tuple2[System.Net.HttpStatusCode,System.Collections.Generic.IDictionary2[System.String,System.Object]],System.Threading.Tasks.Task1[System.Tuple2[System.Net.HttpStatusCode,System.Collections.Generic.IDictionary2[System.String,System.Object]]]].InnerInvoke () [0x00027] in /Users/builder/data/lanes/2058/58099c53/source/mono/external/referencesource/mscorlib/system/threading/Tasks/TaskContinuation.cs:207 [MonoDroid] at System.Threading.Tasks.Task.Execute () [0x00016] in /Users/builder/data/lanes/2058/58099c53/source/mono/external/referencesource/mscorlib/system/threading/Tasks/Task.cs:2523 [MonoDroid] --- End of stack trace from previous location where exception was thrown --- [MonoDroid] at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000b] in /Users/builder/data/lanes/2058/58099c53/source/mono/mcs/class/corlib/System.Runtime.ExceptionServices/ExceptionDispatchInfo.cs:61 [MonoDroid] at Parse.Internal.InternalExtensions+<>c__DisplayClass7 1[System.Object].<OnSuccess>b__6 (System.Threading.Tasks.Task t) [0x00033] in <filename unknown>:0 [MonoDroid] at System.Threading.Tasks.ContinuationResultTaskFromTask 1[System.Threading.Tasks.Task 1[System.Object]].InnerInvoke () [0x00027] in /Users/builder/data/lanes/2058/58099c53/source/mono/external/referencesource/mscorlib/system/threading/Tasks/TaskContinuation.cs:111 [MonoDroid] at System.Threading.Tasks.Task.Execute () [0x00016] in /Users/builder/data/lanes/2058/58099c53/source/mono/external/referencesource/mscorlib/system/threading/Tasks/Task.cs:2523 [MonoDroid] --- End of inner exception stack trace --- [MonoDroid] at System.Threading.Tasks.Task.ThrowIfExceptional (bool) [0x00014] in /Users/builder/data/lanes/2058/58099c53/source/mono/external/referencesource/mscorlib/system/threading/Tasks/Task.cs:2168 [MonoDroid] at System.Threading.Tasks.Task.Wait (int,System.Threading.CancellationToken) [0x00052] in /Users/builder/data/lanes/2058/58099c53/source/mono/external/referencesource/mscorlib/system/threading/Tasks/Task.cs:3218 [MonoDroid] at System.Threading.Tasks.Task.Wait (int) [0x00000] in /Users/builder/data/lanes/2058/58099c53/source/mono/external/referencesource/mscorlib/system/threading/Tasks/Task.cs:3159 [MonoDroid] at Parse.ParsePushService.OnHandleIntent (Android.Content.Intent) <IL 0x00063, 0x0033b> [MonoDroid] at Android.App.IntentService.n_OnHandleIntent_Landroid_content_Intent_ (intptr,intptr,intptr) [0x00011] in /Users/builder/data/lanes/2058/58099c53/source/monodroid/src/Mono.Android/platforms/android-22/src/generated/Android.App.IntentService.cs:141 [MonoDroid] at (wrapper dynamic-method) object.4f1ee6dc-1a44-45bb-ba65-81f69a0db824 (intptr,intptr,intptr) <IL 0x00017, 0x00043> [MonoDroid] ---> (Inner Exception #0) System.FormatException: String was not recognized as a valid DateTime. [MonoDroid] at System.DateTimeParse.ParseExact (System.String s, System.String format, System.Globalization.DateTimeFormatInfo dtfi, DateTimeStyles style) [0x00027] in /Users/builder/data/lanes/2058/58099c53/source/mono/external/referencesource/mscorlib/system/globalization/datetimeparse.cs:57 [MonoDroid] at System.DateTime.ParseExact (System.String s, System.String format, IFormatProvider provider) [0x00000] in /Users/builder/data/lanes/2058/58099c53/source/mono/external/referencesource/mscorlib/system/datetime.cs:1083 [MonoDroid] at Parse.ParseClient.ParseDate (System.String input) [0x0000b] in <filename unknown>:0 [MonoDroid] at Parse.ParseObject.MergeMagicFields (IDictionary 2 data) [0x000a4] in :0 [MonoDroid] at Parse.ParseObject.MergeFromServer (IDictionary 2 data) [0x0001a] in <filename unknown>:0 [MonoDroid] at Parse.ParseObject.MergeAfterSave (IDictionary 2 result) [0x0003a] in :0 [MonoDroid] at Parse.ParseObject+<>c__DisplayClass2a.b__26 (System.Threading.Tasks.Task 1 t) [0x0004c] in <filename unknown>:0 [MonoDroid] at System.Threading.Tasks.ContinuationResultTaskFromResultTask 2[System.Tuple2[System.Net.HttpStatusCode,System.Collections.Generic.IDictionary2[System.String,System.Object]],System.Threading.Tasks.Task1[System.Tuple2[System.Net.HttpStatusCode,System.Collections.Generic.IDictionary 2[System.String,System.Object]]]].InnerInvoke () [0x00027] in /Users/builder/data/lanes/2058/58099c53/source/mono/external/referencesource/mscorlib/system/threading/Tasks/TaskContinuation.cs:207 [MonoDroid] at System.Threading.Tasks.Task.Execute () [0x00016] in /Users/builder/data/lanes/2058/58099c53/source/mono/external/referencesource/mscorlib/system/threading/Tasks/Task.cs:2523 [MonoDroid] --- End of stack trace from previous location where exception was thrown --- [MonoDroid] at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000b] in /Users/builder/data/lanes/2058/58099c53/source/mono/mcs/class/corlib/System.Runtime.ExceptionServices/ExceptionDispatchInfo.cs:61 [MonoDroid] at Parse.Internal.InternalExtensions+<>c__DisplayClass7 1[System.Object].b__6 (System.Threading.Tasks.Task t) [0x00033] in :0 [MonoDroid] at System.Threading.Tasks.ContinuationResultTaskFromTask1[System.Threading.Tasks.Task1[System.Object]].InnerInvoke () [0x00027] in /Users/builder/data/lanes/2058/58099c53/source/mono/external/referencesource/mscorlib/system/threading/Tasks/TaskContinuation.cs:111 [MonoDroid] at System.Threading.Tasks.Task.Execute () [0x00016] in /Users/builder/data/lanes/2058/58099c53/source/mono/external/referencesource/mscorlib/system/threading/Tasks/Task.cs:2523 <--- 关系
  • Java使用与C
  • 相同的比较原型
  • 我不了解其他语言:)

答案 3 :(得分:2)

如果我们假设f是比较函数,那么我们假设它的返回值表示传递的两个整数之间的关系,暗示它们是否必须交换,通常如下:

  • -1:在排序顺序中,第一个整数在第二个整数之前,所以不要交换;

  • 0:在排序顺序中,两个整数被认为是相等的,所以不要交换;

  • +1:在排序顺序中,第二个整数应该在第一个整数之前,所以要交换这些值。

在数组中重复循环,直到f仅返回-10。然后根据比较函数对阵列进行排序。请注意,我们不需要知道f实际上做了什么。

注意:代替-1+1,函数也可以返回“小于0”和“大于零”,所以为了安全,只能将其用作测试。

注意:f可以做任何事情,例如检查一个整数的平方是否小于第二个整数的根。你不在乎。