排序法之简单排序法/冒泡排序/插入排序/快速排序~详解

本文详细介绍了四种常见的排序算法:选择排序、冒泡排序、插入排序和快速排序。通过具体实例展示了每种排序算法的工作原理和实现过程,帮助读者深入理解这些算法的特点及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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+"  ");
		}					
	}
		
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值