C语言关键码序列 66 13 51 76 81 26 57 69 23 谁能给我解释一下答案,见详细,尤其是66怎么跑的 100
并以第一个 元素为划分基准 那么 第一趟划分结果为第一趟:基准指针与low指针一致,所以和high指针的值进行比较,不满足要求,所以low和high值互换,基准指针指向high,low的值就定了,low就往后面移动一个.
以后同上,直到low=high.
23,13,51,76,81,26,57,69,66
23,13,51,66,81,26,57,69,76
23,13,51,57,81,26,66,69,76
23,13,51,57,66,26,81,69,76
23,13,51,57,26,66,81,69,76
搜了答案还是不理解。。。
先
66和23比较66>23所以交换变成
23,13,51,76,81,26,57,69,66
13和66比较不交换
51和66比较不交换
76和66比较交换
23,13,51,66,81,26,57,69,76
69和66比较不交换
从这步开始,66怎么就和69比较了?
57和66比较交换
23,13,51,57,81,26,66,69,76
81和66比较交换
23,13,51,57,66,26,87,69,76
26和66比较交换
23,13,51,57,26,66,87,69,76 展开
2017-03-20
1.起止指针 low high,基准指针index 一开始指向最后一位元素.
2.先左边 low一直往右移,直到找到一个比index大的元素,low index交换.
3.high 左移,直到找到一个比index小的元素, high index 交换.
4.重复 2 3步 直到low = high.
看完也没明白
有三个指针,一个是指向 low,一个指向 high,一个指向基准,low 指针是从首元素开始,high 指针是从末元素开始的,基准指针一定指向 KEY;
循环的目的是: KEY 前面的元素小于KEY,后面的元素大于KEY;
下标从0开始,元素为 num[0]。
具体过程如下:
最开始,序列 66 13 51 76 81 26 57 69 23,low指针指向num[0] = 66,high 指针指向num[8] = 23,KEY = 首元素66;
high 指针移动方向是从后到前,直到找到比 KEY 小的值才停止,交换指向的元素与 KEY 。high 指向num[8] = 23,比 66小,交换元素,序列成为:
23 13 51 76 81 26 57 69 66
low 指针移动方向是从前到后,直到找到比 KEY 大的值才停止。low 指向num[0] = 23,比66小,low 指针继续移动,num[1] = 13,小于66,继续移动,num[2] = 51,小于66,继续移动,num[3] = 76,大于66,停止移动,交换num[4] 与 KEY ,序列成为:
23 13 51 66 81 26 57 69 76
重复过程2,high 指向 num[8],但是你会发现,末元素 与 KEY 刚才在过程3 交换过,所以必定保证了现有序列中末元素的值大于 KEY ,所以可以跳过这个元素,从它的前一位开始(high--),num[7] = 69,大于66, 继续移动,num[6] = 57,小于66,停止移动,交换num[6] 与 KEY,序列成为:
23 13 51 57 81 26 66 69 76
重复过程3,low 指向 num[3],但是你会发现,num[3] 与 KEY 刚才在过程4 交换过,所以必定保证了num[3] 小于 KEY ,所以可以跳过这个元素,从它的后一位开始( low++),num[4] = 81,大于66,停止移动,交换元素,序列成为:
23 13 51 57 66 26 81 69 76
重复过程4,跳过 num[6](high--),num[5] = 26,小于66,停止移动,交换元素,序列成为:
23 13 51 57 26 66 81 69 76
high 和 low 指针指向的下标相同,循环停止。