public class Demo {
/**
* 快速排序是在排序算法中最快的算法
* 快速排序:
* 通过一趟排序将要排序的数据分割成独立的两部分
* 其中一部分数据要都比另外一部分的所有数据小
* 然后按照此方法对部分进行排序,依次递归进行以达到目的。
* 假设,用户输入了以下数组:
* 下标: 0 1 2 3 4 5
* 数字: 6 2 7 3 8 9
* 定义i=0;(指向第一个数),定义j=5;(指向最后一个数据),定义中间变量k,把第一个数据赋值给k。
* 第一次比较要把所有比k小的移到K的左边,所以要寻找比6小的数,从右往左,从j开始,不断递减j的值。
* 找到了第一个下标为3的数字3比6小,于是把数字3移到下标0的位置,把下标为0的数字6移到下标为3的位置上,完成第一次比较
* 下标: 0 1 2 3 4 5
* 数字: 3 2 7 6 8 9
* 此时i=0;j=3;k=6。
* 接着开始第二次比较,这次要寻找比K大的数,并且要从左往右找。递加变量i,发现下标为2的数据是第一个比K大的。
* 于是用下标为2的数据7和j指向的数据交换。
* 下标: 0 1 2 3 4 5
* 数字: 3 2 6 7 8 9
* 此时i=2;j=2;k=6
* 以上两次循环称为一次循环。
* 接着,再次重复上面的第一次循环操作,递减变量j;递减i...;不断重复进行上面的循环
*
* 在本例中我们进行一次循环,就发现i与j相等了,他们都指向了下标2。于是,第一遍比较结束。
* 下标: 0 1 2 3 4 5
* 数字: 3 2 6 7 8 9
* 此时我们发现作为i与j碰头下标所指向的中间变量6,右边都比6小;左边都比6大。
*
* 要是i和j没有碰头的话。就会一直递加i找大的,再没有,就再递减j找小的。如此循环不断往复。
* 注意判断和寻找是同时进行的。
*
* 第一遍快速排序不会导致最终的结果,只会把比K大的移到左边,比k小的移到右边。
* 为了得到最终结果,需要再次对两边的数组分别进行快速排序,直到数组不能再分解为止。
*/
private static void sort(int[] arr,int left,int right) {
/*低位置起始点*/
int low = left;
/*高位置起始点*/
int hight = right;
/*要比较的数据为低位置起始点的值*/
int data = arr[low];
while (low < hight) {
while(low < hight&&arr[hight] >=data){
hight--;
}
/*把比它小的放左边,因为low最终为data*/
if (low<hight) {
arr[low]=arr[hight];
/*因为我跟你比较过了所以下次不比较了,加一*/
low++;
}
while(low < hight&&arr[low]<= data){
low++;
}
/*把比它大的放右边*/
if (low<hight) {
arr[hight] = arr[low];
/*因为我跟你比较过了所以下次不比较了,减一*/
hight--;
}
}
/*注意下标为low最终为data*/
arr[low]=data;
/*因为在data右边都比data大,所以现有data的右边在下一次排序时候不需要再排了*/
if(low>left){
sort(arr,left,hight-1);
}
/*因为在data左边都比data小,所以现有data的左边边在下一次排序时候不需要再排了*/
if(hight<right){
sort(arr,low+1,right);
}
}
public static void sort(int[] arr){
sort(arr,0,arr.length-1);
}
public static void main(String[] args) {
int [] arr={3,9,6,1,8,7,5,0};
Demo.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
排序算法:(一)快速排序
最新推荐文章于 2022-08-13 03:00:00 发布