数据结构 - - - - - - 排序

本文深入探讨了三种常见的排序算法:直接插入排序、选择排序和冒泡排序。详细解析了每种排序算法的工作原理及其实现,通过实例测试验证了它们的效率和应用场景。
摘要由CSDN通过智能技术生成

直接插入排序

package ch02;

public class InsertSort {
	/**
	 * 直接插入排序演示,从小到大
	 * 视屏中的排序有点小问题,是第i个和他的前一个相比较,不是和它自身相比较
	 * @param arr
	 */
	public static void sort(long[] arr){
		long tmp =0;
		for(int i =1; i < arr.length; i++){//插入排序是从第二个元素之间插入的,所以位置为2,下标为1,i为一共要复制几轮元素进行插入比较
			tmp = arr[i];//拷贝数组中的第一个元素
			int j =i;
			while(j>0 && arr[j-1] >= tmp){//拷贝完成后将自身和排在前一个元素的相比较,如果小于则将前一个元素拷贝于自身
				arr[j] = arr[j-1];
				j--;//数组中有多个元素,就不停的进行元素后移操作,但前提是j不能小于0,因为之后要进行位移操作,否则会报空指针异常
			}
			arr[j] 	= tmp;//最后把拷贝后的元素,放入空出来的位置,排序完成。
		}
	}
}

选择排序

package ch02;

public class SelectionSort {
	/**
	 * 选择排序演示,从小到大
	 * 每一轮,从剩余元素中,取第一个和其他元素相比取最小
	 * 和视屏上的算法不一样,其实道理相差无几,不过是多引用了一个变脸k的概念。
	 * @param arr
	 */
	public static void sort(long[] arr){
		
		long tmp =0;//中间空间
		
		for (int i = 0; i < arr.length-1; i++) {//假如有4个元素,数组长度为4,只需要排序三趟,从第i为0开始,0、1、2
			for (int j = i+1; j < arr.length; j++) {//也是比较三次。从第一个元素和剩余的其他元素相比较。
				if (arr[i]>arr[j]) {
					tmp = arr[i];
					arr[i] = arr[j];
					arr[j] = tmp;	
				}
			}
		}
	}
}

冒泡排序

package ch02;

public class BubbleSort {

	public static void sort(long[] arr) {
		// TODO Auto-generated method stub
		/**
		 * 冒泡排序演示,从小到大
		 * 每一轮在剩余元素中两两相较取最小
		 * 每次排序将剩余元素最小的那个元素放置在这一趟剩余元素的最前面
		 */
		long tmp =0;//中间空间
		
		for (int i = 0; i < arr.length-1; i++) {//arr.leng-1表示8个元素只需要排序7趟
			for (int j = arr.length-1; j>i; j--) {//j>i表示:之前排过的元素就不用比较了
				if (arr[j]<arr[j-1]) {//末尾往前开始进行比较交换
					//进行交换
					tmp = arr[j]; 
					arr[j] = arr[j-1];
					arr[j-1]  = tmp;
				}
			}
		}
		
	}

}

测试类

package ch02;


public class TestSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long[] arr = new long[5];
		arr[0] =34;
		arr[1] =23;
		arr[2] =38;
		arr[3] =1;
		arr[4] =-4;
		System.out.print("[");
		for(long num : arr){
			System.out.print(num+" ");
		}
		System.out.print("]");
		System.out.println();
		
		//BubbleSort.sort(arr);
		//SelectionSort.sort(arr);
		InsertSort.sort(arr);
		
		System.out.print("[");
		for(long num : arr){
			System.out.print(num+" ");
		}
		System.out.print("]");
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值