您的位置:首页 > 编程语言 > Java开发

快速排序java代码实现

2018-03-01 14:57 288 查看
说明:

    快速排序是一个速度非常快的交换排序算法,它的基本思路很简单,从待排的数据序列中任取一个数据(如第一个数据)作为基准值,所有比它小的元素放到左边,所有比它大的元素放到右边。经过这样一趟下来,该序列形成左右两个子序列,左边序列中的数据元素的值都比基准值小,右边序列中数据元素的值都比基准值大。接下来对左右两个子序列进行递归排序。
平均时间复杂度是T(n) = o(logn)
实现步骤:
    1、定义一个变量i从坐起第一个索引开始,找大于基准值的元素的索引,并用i记录;

    2、定义一个变量j,从右起第一个索引开始,找小于基准值的元素的索引,并用j来记录。
    3、如果i < j,交换i、j两个索引处的元素。

    重复执行以上1、2、3步骤,直到i>=j,可以判断j左边的元素都小于基准值,j右边的元素都大于基准值,最后将基准值与j索引处的元素交换即可。

代码:
public class Test {

public static void main(String[] args) {
int[] data = new int[]{ 5, 3, 6, 2, 1, 9, 4, 8, 7, 10};
System.out.println("排序前的数组");
print(data);
System.out.println("开始排序");
quickSort(data,0,data.length-1);
System.out.println("排序后的数组");
print(data);
}

/**
* 快速排序
* @param data 数组
* @param begin 开始下标
* @param end 结束下标
*/
private static void quickSort(int[] data, int begin, int end) {
if(begin>=end)return;
int point = data[begin];//保存起始值作为基准数
int i = begin+1;
int j = end;
while(true){
while(i<end && data[i]<point){//从前往后:找到大于point的数的下标i
i++;
}
while(j>begin && data[j]>point){//从后往前:找到小于point的数的下标j
j--;
}
if(i<j){//如果i在前面,则交换位置
swap(data,i,j);
}else{//否则退出循环
break;
}
}
//以上循环完成后,小于point的数全都在前面,大于point的数全都在后面,
//下标j对应的数data[j]是小于point的,所以要单独交换
System.out.println("交换前:");
print(data);
swap(data,begin,j);
System.out.println("交换后:");
print(data);
//递归两边
quickSort(data,begin,j-1);
quickSort(data,j+1,end);
}

/**
* 打印数组
* @param data
*/
private static void print(int[] data) {
for(int i=0;i<data.length;i++){
System.out.print(data[i]+"\t");
}
System.out.println();
}

/**

4000
* 交换数组中两个不同下标位置对应的数据
* @param data 数组
* @param i 下标i
* @param j 下标j
*/
public static void swap(int[] data,int i,int j){
if(i==j){
return;
}
data[i] = data[i]+data[j];
data[j] = data[i]-data[j];
data[i] = data[i]-data[j];
}
}输出结果:排序前的数组
5 3 6 2 1 9 4 8 7 10
开始排序
交换前:
5 3 4 2 1 9 6 8 7 10
交换后:
1 3 4 2 5 9 6 8 7 10
交换前:
1 3 4 2 5 9 6 8 7 10
交换后:
1 3 4 2 5 9 6 8 7 10
交换前:
1 3 2 4 5 9 6 8 7 10
交换后:
1 2 3 4 5 9 6 8 7 10
交换前:
1 2 3 4 5 9 6 8 7 10
交换后:
1 2 3 4 5 7 6 8 9 10
交换前:
1 2 3 4 5 7 6 8 9 10
交换后:
1 2 3 4 5 6 7 8 9 10
排序后的数组
1 2 3 4 5 6 7 8 9 10
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  快速排序 java