您的位置:首页 > 其它

算法学习之排序:快速排序算法

2015-11-21 15:43 423 查看
算法是程序的灵魂

1.简介

假设待排序数组为:A[0]…A[N-1]。取第一个数据A[0]作为关键数据,将所有比它小的数放在它前面,所有比它大的数放在它后面。这个过程称为一趟快速排序。递归调用“一趟”的操作,对数组进行分半处理。

2.算法描述

1)设置两个变量i、j,排序开始的时候 i = 0, j = N-1

2)以第一个元素作为关键数据, 赋值给key,即key=A[0]

3)从j开始向前搜索(j- -),找到第一个小于key的值A[j],记录此时的位置,j

4)从i开始向后搜索( i++ ),找到第一个大于key的值A[i],记录此时的位置,i

5)交换A[i]于A[j]的值

6)重复3),4),5)的操作,直到i=j,然后交换A[i]与key的值

7)递归调用,将数组分左右两部分重复以上所有步骤。

3.代码

//定义一个类QuickSort
public class QuickSort{
Integer[] arr;
QuickSort(Integer[] arr){
this.arr = arr;
}
public void sort(int left,int right){
int i = left;//记录低位
int j = right;//记录高位
int t = 0;//交换数据的中间变量
int key = 0;//基准数
if(left > right){
return;
}
key = arr[left];//以最左侧数据为基准数
while(i != j){
//从右边开始找,找到比key小的数
while(arr[j] >= key && i < j){
j--;
}
//从左边开始找,找到比key大的数
while(arr[i] <= key && i < j){
i++;
}
//交换找到的比key小的数和比key大的数
if(i < j){
t = arr[j];
arr[j]= arr[i];
arr[i] = t;
}
}//while
//将基准数放置于中间位置,它左边数全部小于它,右边全部大于
arr[left] = arr[i];
arr[i] = key;
//递归调用
sort(left,i-1);
sort(i+1,right);
}
}
//测试类TestClass
public class TestClass{
public static void main(String[] args){
Integer[] list = {1,9,3,8,4};
QuickSort quickSort = new QuickSort(list);
quickSort.sort(0,list.length-1);
for(int i = 0;i<list.length;i++){
System.out.print(list[i]+" ");
}
}
}


参考资料:

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