几种常见的排序算法

本文介绍了三种常见的排序算法:选择排序、冒泡排序和插入排序。选择排序通过每次找出最小元素并交换位置实现排序,不保证稳定性。冒泡排序通过相邻元素两两比较交换位置,效率较低。插入排序则通过找到插入点将元素逐个插入已排序部分,保持稳定性。

几种常见的排序算法

(1)选择排序
选择排序是一种简单的,但不稳定的排序算法
排序规则:

  • (升序)第一次循环认为第一个元素为最小值,拿第一个元素的值与其后的每个元素的值进行比较,如果其后元素的值小于第一个元素的值则交换位置,依次进行比较,最终将最小的元素放到第一个位置;第二次及其以后的循环从第未排序的元素开始按照第一次的比较方式依次进行比较,直到整个数组排好序位置;

  • 每次将一个元素与其后的每个元素比较,每轮比较都将最小的元素获取到并放入指定的位置

/*选择排序(升序)*/
public class SelectSort {
	public static void main(String[] args) {
		//定义数组
		int nums[] = {20,15,18,85,40};
		//输出数组
		System.out.print("排序前:  ");
		for(int num : nums) {
			System.out.print(num+" ");
		}
		
		//外层循环控制轮数
		for(int i=0;i<nums.length-1;i++) {
			//内层循环控制每轮比较的次数,假设未比较前第一个为最小值(从大到小)
			for(int j=i+1;j<nums.length;j++) {
			//使用最小值与其后的每个元素进行比较
				if(nums[i]<nums[j]) {
					//交换位置
					int temp = nums[j];
					nums[j] = nums[i];
					nums[i] = temp;
				}
			}
		}
		
		System.out.println();
		//排序后输出数组
		System.out.print("排序后:  ");
		for(int num : nums) {
			System.out.print(num+" ");
		}
	}
		
}
		
	

在这里插入图片描述
(2)冒泡排序

  • 冒泡排序是一个简单的排序,但效率不高

排序规则:

  • 将数组元素相邻的两个元素进行比较,根据大小交换位置,多次比较后确定顺序的一种比较方式

排序方法:

  • 外层循环n-1,内层循环n-1-i,两两比较交换位置
/*冒泡排序(升序)*/
public class Sort {
	public static void main(String[] args) {
		
		int nums[] = {23,19,49,30,34,66,58,78,5};
		
		System.out.print("排序前:  ");
		for(int num : nums) {
			System.out.print(num+" ");
		}
		
		//控制轮数
		for(int i=0;i<nums.length-1;i++) {
			//控制比较的次数
			for(int j=0;j<nums.length-1-i;j++) {
				if(nums[j]>nums[j+1]) {
					//交换位置
					int temp = nums[j];
					nums[j] = nums[j+1];
					nums[j+1] = temp;
				}
			}
		}
		
		System.out.println();
		
		System.out.print("排序后:  ");
		for(int num : nums) {
			System.out.print(num+" ");
		}
	}
		
}

在这里插入图片描述
(3)插入排序

  • 选择排序是一种简单的,但稳定的排序算法

排序规则:

  • 将数组中的一个元素做为待排序的元素,与其前面的元素进行比较,找到插入点并将待排序的元素插入到指定的插入点;
/*插入排序(升序)*/
public class InsertSort {
	public static void main(String[] args) {
		
		int nums[] = {36,22,58,65,40};
		
		System.out.print("排序前:  ");
		for(int num : nums) {
			System.out.print(num+" ");
		}
		
		for(int i=1;i<nums.length;i++) {
			//获得插入的元素
			int temp = nums[i];
			//设置一个初始插入点,-1表示没有
			int insertPost = -1;
			//内层循环用于与 待排序元素前的 所有元素进行比较 以查找插入点
			for(int j=i-1;j>=0;j--) {
				//用待插入元素和之前的元素进行比较并移动
				if(temp<nums[j]) {
					//移位,将前一个元素移动到后一个位置
					nums[j+1]=nums[j];
					//设置新的插入点
					insertPost = j;
				}else {
					break;//退出循环,已确认最终插入点
				}
			}
			
			//插入待排序的元素
			if(insertPost!=-1) {
				nums[insertPost] = temp;
			}
		}	
		
		
		System.out.println();
		
		System.out.print("排序后:  ");
		for(int num : nums) {
			System.out.print(num+" ");
		}
	}
}
		

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值