对于家庭作业,我必须编写一个函数,如果作为参数传递的数组已经排序,则返回该函数:
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/时,我在这里看到他们认为数组只有在升序时才会排序。
我不想在一般情况下就排序的含义展开任何争论,但如果排序在编程中具有特殊含义,请告诉我!
答案 0 :(得分:4)
您的作业很可能希望您将该功能用作对要编写的排序功能的验证。在此上下文中,“排序”表示“排序函数的可接受输出”。
如果你必须编写一个排序函数,你很可能不会随机编写一个按升序或降序排序的函数。所以匹配。
我们还没有看到你的作业,但是除非另有说明,否则我们在这里做的是假定升序。
答案 1 :(得分:3)
对于某些比较函数,每个序列都可以被视为“已排序”。
您需要弄清楚需要应用哪种比较功能。最好在您的实现中,您可以将其保留为用户提供的回调。
答案 2 :(得分:2)
对于C语言
传递给函数的函数指针用作比较函数。
通常,比较函数的设计是为了使i
和j
两个索引i<j
f(tab[i], tab[j]) < 0
,tab[i]
如果tab[j]
和f
{1}}位于比较函数定义的顺序中。
例如int f(int a, int b) { return b-a; }
可以实现为:
int f(int a, int b) { return a-b; }
按降序排序。并实施为:
a
升序排序。
参考的
所有语言
所有编程语言都没有关于如何定义比较函数的全局约定。
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 <---
关系答案 3 :(得分:2)
如果我们假设f
是比较函数,那么我们假设它的返回值表示传递的两个整数之间的关系,暗示它们是否必须交换,通常如下:
-1
:在排序顺序中,第一个整数在第二个整数之前,所以不要交换;
0
:在排序顺序中,两个整数被认为是相等的,所以不要交换;
+1
:在排序顺序中,第二个整数应该在第一个整数之前,所以要交换这些值。
在数组中重复循环,直到f
仅返回-1
或0
。然后根据比较函数对阵列进行排序。请注意,我们不需要知道f
实际上做了什么。
注意:代替-1
和+1
,函数也可以返回“小于0”和“大于零”,所以为了安全,只能将其用作测试。
注意:f
可以做任何事情,例如检查一个整数的平方是否小于第二个整数的根。你不在乎。