快速排序(分治思想)
思想:选定一个元素做中轴,一般是数组最后一个元素,从两头遍历数组,左边比中轴大的元素和右边小于等于中轴的元素对换,当左游标大于等于右游标的时候,左游标处的值一定是大于中轴值的,将左游标处的值与末尾的中轴值交换,就完成了第一次的分割,接下来,对中轴两边的数组段再次进行上述相同的处理。最终就得到了排序好的数组。
快速排序用了分而治之的思想,把大问题分割为小问题,小问题的求解方式与大问题是一样的,只是规模小,最终小问题的解集合起来就是大问题的解。
int partition(int arr[],int leftBound,int rightBound)
{int left = leftBound;int right = rightBound-1;int tmp = arr[rightBound];while(left <= right){while(left<=right && arr[left] <= tmp) left++;//arr[right]与tmp的比较不加等于的原因是,如果加了等于,那么在中轴的右边会出现和中轴值一样的值.while(left<=right && arr[right] > tmp) right++;if(left < right) swap(arr,left,right);}//left处的值一定是大于中轴值,也就是rightBound处的值swap(arr,left,rightBound);return left;
}void sort(int arr[],int leftBound,int rightBound)
{if(leftBound >= rightBound) return;int mid = partition(arr,leftBound,rightBound);sort(arr,leftBound,mid-1);sort(arr,mid+1,rightBound);
}void quickSort(int arr[],int len)
{sort(arr,0,len-1);
}