快速排序
时间复杂度最坏n2,平均nlogn
解释:遍历一次O(n),快排采用分治法来遍历,看成二叉树,那么遍历的次数跟他的深度有关系,n个节点,那么深度至少是log(n+1),所以平均nlogn;二叉树最大深度那就是N了,所以最坏时间复杂度n2。
//找基准数,并放到中间 //此函数执行一次,就找到了一个基准数并且就放在了正确位置 int mid_index(arr[],left,right){ int i=left+1; int j=right; int temp=arr[left]; while(i<=j){ while(arr[i]<temp) i++; while(arr[j]>temp) j--; if(i<j) swap(arr[i++],arr[j++]); } //到了边界了 swap(arr[j],arr[left]); return j; } void quick_sort(arr[],left,right){ //保证长度至少为2 if(left>=right) return; int mid=mid_index(arr,left,right); quick_sort(arr,left,mid-1); quick_sort(arr,mid+1,right); }
边界问题分析(第一个while循环条件i<=j):
当i=j时,正好arr中心处,此时arr[i]==arr[j]:
- 若该值小于temp,i++后i到了第一个大于temp的数,j不变,此时交换arr[j]和arr[left],j左边的值就都小于基准值,右边都大于基准值,也就是说这个基准值到了正确的位置了
- 若arr[i]==arr[j] > temp,i不判断,j--之后到了最后一个小于基准值的数,此时i>j,交换arr[j]和arr[left],同上