您的位置:首页 > 其它

排序算法 快速排序

2018-03-13 21:13 190 查看
转载自:http://blog.csdn.net/lemon_tree12138/article/details/50622744

1.基本思想

分治思想,对冒泡排序改进。

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

2.步骤:

1)获得待排序数组a

2)选取一个合适的数字p(一般来说就选取数组或是子数组的第一个元素)作为排序基准

3)将待排序数组a中比基准p小的放在p的左边,比基准p大的放在p的右边

4)从第3步获得的两个子数组sub1跟sub2

5)判断sub1或sub2中是否只有一个元素,如果只有一个元素则返回此元素,否则就将sub1(或是sub2)代回到第1步中继续执行

3.复杂度分析:



如果我们在选取基准p的时候,每次选取的都是当前数组中最小的一个元素,那么每次划分都只是让数组中的元素少1(被筛选出来的那个元素当然有序),这样一来就需要反复遍历数组导致复杂度变成了O(n2)。

 如果我们在选取基准p的时候,每次选取的都是当前数组中最中间的一个元素(是中位数,而不是元素位置上的中间),那么每次划分都把当前数组划分成了长度相等的两个子数组,这样一来复杂度变成了O(nlog2n)。

4.代码

//快速排序

//打印排序的序列
public static void quickSort(int[] arr){
sortCore(arr,0,arr.length-1);

StringBuilder num=new StringBuilder();
for(int i:arr){
num.append(i+" ");
}

System.out.println(num.toString());
}

//核心排序算法
public static void sortCore(int[] arr,int startIndex,int endIndex){
if(startIndex>=endIndex){
return;
}

int boundary=boundary(arr,startIndex,endIndex);

sortCore(arr,startIndex,boundary);
sortCore(arr,boundary+1,endIndex);
}

//左右两区部分数据 交换并返回分界点
private static int boundary(int[] arr, int start, int end) {
int standard=arr[start];//定义标准,即最左元素
int leftIndex=start;//左指针
int rightIndex=end;//右指针

while(leftIndex<rightIndex){
while(leftIndex<rightIndex && arr[rightIndex]>=standard){
rightIndex--; //从右向左查找
}
arr[leftIndex]=arr[rightIndex];//小于基准的移到左端

while(leftIndex<rightIndex && arr[leftIndex]<=standard){
leftIndex++;//从左往右查找
}
arr[rightIndex]=arr[leftIndex];//大于基准的移到右端
}
arr[leftIndex]=standard;//基准位置不再变化,基准值来到中间
return leftIndex;
}


91a5
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: