一、快速排序思想
快速排序是冒泡排序的改善算法,冒泡排序只能在相邻的两个值之间进行比较交换,这样交换的次数比较多的情况下,效率比较低,而快速排序的思想是分治和递归的思想,取定数组其中一个值作为基数,将待排序数组排序分为左边小于基数的数组,右边大于基数的思想(假设是是升序排序,递归方法后面讲解),然后排序完的左右两边的数组再和初始数组的排序分治方法一样再进行排序(也就是递归过程),直到待排序的数组的数量为1(跳出递归的判断),即不用再排序了,整个数组也就排序好了。这个递归的方法如何写?即如何将数组分为左边小于基数,右边大于基数。假设我们取待待续数组左边的第一个为基数(后面再交换到中间),待排序数组左边从左到右找出比基数大的与待排序数组右边从右到左找出比基数小的进行交换,依次进行遍历,直到找到的左边进行比较的序号和右边比较的序号相等或左边序号大于右边序号了,这个找到的序号就是中间序号了,也就是基数应该进行交换的位置,和基数进行交换。以基数为分割线,这样就分出了左边比基数小,右边比基数大。下面我们函数来写出上述过程
void fastRecursive(int* list,int left_position,int right_postion){ if(left_position<0||right_postion<0||left_position>=right_postion){ return; } int l = left_position; int r = right_postion; int middle_postion = left_position; int base_value = list[left_position]; // while(r>l){ //遍历数组右边,直到找到一个比基数小的 while(l<r&&list[r]>base_value){ r--; } //遍历数组左边,直到找到一个比基数大的 while(l<r&&list[l]<=base_value){ l++; } if(r>l){ // LOGI("交换:%d,%d",list[l],list[r]); swap(&list[l],&list[r]); } }; swap(&list[l],&list[middle_postion]); middle_postion = l; fastRecursive(list,left_position,middle_postion-1);//递归排序左边 fastRecursive(list,middle_postion+1,right_postion); } void fastSort(int* list,int len){ fastRecursive(list,0,len-1); }
它的时间复杂度O (nlogn),最差的时候是o(n平方)