先考虑一下这个问题:“123456”是6个1位数,还是1个6位数?
程序不能有歧义,所以多个数字要用分隔符分开,才能区分上述两种情况。c语言中,如果不指定分隔符,一般用空格、制表或者换行作为分隔符。
你只输入了一个数字“123456”,还需要再输入4个数字,但是输入了字母,导致后面4个数字输入失败并跳过。于是第一个“123456”正常输出,后面4个数字都是奇怪的值。
你可以这样输入:“1 2 3 4 5”(用空格作为分隔符)
输入时,输入5个的数字之间用空格间隔,如:12345 2468 3721 1 23
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
假设一开始序列a[i]是:5,3,7,6,4,1,0,2,9,10,8。
此时,key=5,low=1,high=11,从后往前找,第一个比5小的数是[8]=2,因此序列为:2,3,7,6,4,1,0,5,9,10,8。
此时low=1,high=8,从前往后找,第一个比5大的数是a[3]=7,因此序列为:2,3,5,6,4,1,0,7,9,10,8。
此时,low=3,high=8,从第8位往前找,第一个比5小的数是x[7]=0,因此:2,3,0,6,4,1,5,7,9,10,8。
此时,low=3,high=7,从第3位往后找,第一个比5大的数是a[4]=6,因此:2,3,0,5,4,1,6,7,9,10,8。
此时,low=4,high=7,从第7位往前找,第一个比5小的数是a[6]=1,因此:2,3,0,1,4,5,6,7,9,10,8。
此时,low=4,high=6,从第4位往后找,直到第6位才有比5大的数,这时,low=high=6,key成为一条分界线,它之前的数都比它小,之后的数都比它大,对于前后两部分数,可以采用同样的方法来排序.