Python快速排序不排序右侧

时间:2016-12-15 01:28:22

标签: python algorithm sorting quicksort

以下是我的意见:

 searchFirebaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

        Log.d("FIREBASE",String.valueOf(dataSnapshot.getChildrenCount()));
        String childrenCount = String.valueOf(datasnapshot.getChildrenCount());

       if(childrenCount != null){

          }else{

          //No childrens in Firebase Database
       }

//OR 

       if(!dataSnapshot.exists()){

          //No data   

         }


      }
        @Override
        public void onCancelled(DatabaseError databaseError) {


        }

    });

这是我的代码(由于另一个尚未实现的原因而被称为count):

[3, 9, 8, 4, 6, 10, 2, 5, 7, 1]

我得到以下结果:

def Count(num_list):
global comparisons


if len(num_list) > 1:
    pivot = num_list[0]
    print "Pivot value is: %s, current list is: %s" % (pivot, num_list)
    i = 1
    j = 1

    for j in range(len(num_list)):
        if num_list[j] < pivot:
            print "Swapping %s and %s" % (num_list[i], num_list[j])
            num_list[i], num_list[j] = num_list[j], num_list[i]
            print "List is now: %s" % (num_list)
            i += 1


    num_list[0], num_list[i-1] = num_list[i-1], num_list[0]
    print "List before next recursive step: %s" % num_list

    Count(num_list[:(len(num_list)/2)])
    Count(num_list[(len(num_list)/2):])

print "List at the end of function: %s" % (num_list)

当我查看我制作的所有调试打印语句时,我发现它并没有将左半部分放在一起,但是我无法弄明白。

1 个答案:

答案 0 :(得分:0)

@Natecat和@rcgldr感谢您指点我正确的方向。我的代码只是在第一次进行排序,因为递归调用正在排序从未返回的数组的切片副本。这违背了快速排序的定义,即快速排序。我更新到以下内容并且有效。

def Count(num_list, first, last):
    if first < last:
        global comparisons
        comparisons += len(num_list)-1

        pivot = num_list[first]
        i = first + 1

        # quick sort
        for j in range(first+1,last):
            if num_list[j] < pivot:
                num_list[i], num_list[j] = num_list[j], num_list[i]
                i += 1

        # swap pivot with border index
        num_list[first], num_list[i-1] = num_list[i-1], num_list[first]

        # recurse
        Count(num_list, first, i-1)
        Count(num_list, i, last)