快速排序(一)
快速排序的基本思想:
1:先选定一个特定的数v,将一组数分为三个部分。需要三个下标来表示。l:作为左值,j:标定值,i:作为右值。arr[l+1..j]<v,v,arr[j+1..i-1]>v
2:接着判断i+1后面的部分属于哪一部分。若arr[i+1]>v,不动,直接将该数放在此处就好。
若arr[i+1]<v,则需要将i+1的数放到前一部分去。首先将arr[i+1]和j+1位置处的元素互换。(因为j+1处的元素要大于v)此时将j自加。
分好后,最后一步将特定的数v与当前j处的元素进行互换。
代码展示:使用了递归的方法对要排序的数据不断的进行排序,最后得出的数据就是已排好的数据。
//对arr[l..r]部分进行partition的操作 //返回p,使的arr[l...p-1]<arr[p];arr[p+1,r]>arr[p] template <typename T> int __partition_(T arr[],int l,int r) { T v=arr[l]; int j=l; for(int i=l+1;i<=r;i++) { if(arr[i]<v) { swap(arr[j+1],arr[i]); j++; } } swap(arr[l],arr[j]); return j; } //对arr[l..r]前闭后闭的部分进行快速排序 template <typename T> void __qiuckSort(T arr[],int l,int r) { if(l>=r) return; int p= __partition_(arr,l,r); __qiuckSort(arr,l,p-1); __qiuckSort(arr,p+1,r); } //快速排序:也将使用递归的方式对针对的数据进行排序 template <typename T> void quickSort(T arr[],int n){ __qiuckSort(arr,0,n-1); }