package newproject;
import java.util.Arrays;
public class QuickSort {
/*
// 常用的几种排序。本质上都是互换位置(内部交换),因此我们只需要了解他们交换的套路即可。
*/
//选择排序
//原理最简单,就是外循环i++,内循环j=i,同时j++,也是就array[i]和后面的所有数比大小,最小的占据i的位置,同时继续i++继续最小的
public static void sortXu(int array[]) {
//外循环
for (int i = 0; i < array.length-1; i++) {
//内循环
for (int j = i+1; j <array.length; j++) {
//array[i]依次和array[j++]比大小
if (array[i]>array[j]) {
//互换位置需要中间值temp赋值
int temp = array[i];
array[i] =array[j];
array[j]=temp;
}
}
}
}
//冒泡排序
//原理就是左右互换位置,举例:1与2比较大小,i++,2与3比较大小,i++,3与4比较大小,类推。
//就跟军训站位一样,矮个儿往前,高个儿往后,是不是跟前后比比依次就看了
//外循环一次,最高个在最后,依次
public static void sortMao(int array[]) {
//外循环
for(int i=array.length;i>0;i--) {
//内循环
for(int j=i;j<array.length-1;j++) {
//左右比较大小并且该换位置的换位置
if (array[j]>array[j+1]) {
int temp =array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
}
//插入排序
//其原理是外循环i++ 内循环j=i的同是j-- 也就是i++的过程中,
//新加入的一个数array[i]要跟前面所有的数比较并插入合适的位置.
public static void InsertSort(int[] array1) {
//外循环i++
for(int i =1;i<array1.length;i++) {
//内循j=1同时j--
for(int j=i;j>0;j--) {
//内部冒泡比较大小(也就是左右比较大小,并排序)
if (array1[j]<array1[j-1]) {
int temp =array1[j-1];
array1[j-1]=array1[j];
array1[j]=temp;
}
}
}
}
//快速排序法
//原理是i<j时假设i=left(最左坐标),j=right(最右坐标),选个基准值,比之大的放右边,比之小的放坐边。
//array[i]>=基准值,互换值,也就是互换了位置,同样,array[j]<=基准值,互换值。除了这俩情况就跳过也就是i++,j--.
public static void QuickSort1(int[] array1,int left,int right){
//以left下标也就是array[0]为基准
int privot = array1[left];
//赋值i j 这样移动的就不是 left位置的值了
int i =left;
int j =right;
//当i=j 的时候就说明已经排序好了
while(left>=right) {
return;
}
//当i<j的时候,就不停的循环i++.j--
while(i<j) {
//有一次没想明白,此处While是无限循环 ,只要满足条件就会一直在里面,反之就跳出来。
while(i<j && array1[j] >= privot) {
j--;
}
while(i<j && array1[i]<= privot) {
i++;
}
//跳出循环,也就是i++或者j--到某个位置,不符合条件,也就是可以互换位置的时候了。
//array[i]与array[j]互换位置
int temp =array1[i];
array1[i]=array1[j];
array1[j]=temp;
}
//基准值左边一定是<=,右边一定是>=。所以,此时左边继续调用此方法递归处理
QuickSort1(array1, left, i-1); //left的值没变,=0,这也是一开始赋值i j的原因。懒的换
QuickSort1(array1, i+1, right); //当上面循环走完了,说明此时i=j,在中间(不算奇数个还是偶数个),此时i+1,i-1就可以了
}
//main方法测试
public static void main(String[] args) {
//数组
int[] array = new int[6];
//随机赋值
array[0] = (int)(Math.random()*100);
array[1] = (int)(Math.random()*100);
array[2] = (int)(Math.random()*100);
array[3] = (int)(Math.random()*100);
array[4] = (int)(Math.random()*100);
array[5] = (int)(Math.random()*100);
//Arrays类提供了sort排序方法
Arrays.sort(array);
System.out.println("");
System.out.println("=======java封装好的sort方法=======");
for(int i=0;i<array.length;i++) {
System.out.print(array[i]+" ");
}
//选择排序法
System.out.println("");
System.out.println("======选择排序=======");
sortXu(array);
for(int k=0;k<array.length;k++) {
System.out.print(array[k]+" ");
}
//冒泡排序
System.out.println("");
System.out.println("======冒泡排序=======");
sortMao(array);
for(int p=0;p<array.length;p++) {
System.out.print(array[p]+" ");
}
//插入排序法
System.out.println("");
System.out.println("======插入排序=======");
InsertSort(array);
for (int e:array) {
System.out.print(e+" ");
}
//快速排序法
System.out.println("");
System.out.println("======快速排序=======");
QuickSort1(array, 0, 5);
for (int q:array) {
System.out.print(q+" ");
}
}
}
排序法之简单排序法/冒泡排序/插入排序/快速排序~详解
最新推荐文章于 2024-03-13 20:29:57 发布