算法很美2.2 排序

 

目录

冒泡排序

 插入排序、希尔排序

直接选择排序


冒泡排序

冒泡排序是基于交换的排序,又称之为直接交换排序.

下图冒泡排序的动态演示:

 

其大致思路如下:

1.遍历数组未排序的部分

2.直接比较两个相邻数据,若第一个数据大于第二个数据,则进行交换。

其问题难点再与如何遍历数组当中未排序的部分

  • 通过上图的演示,我们可以看出每进行一次遍历数组,就会将该数组最大的数据置后,而我们完成一次遍历数组之后,就可以不用再次比较这个最大的数据。
  • 还需额外注意一点,若某次遍历完一次数组之后,没有进行交换数据的操作,则说明该数组已经是有序数组,则退出循环即可,从而提高效率。【所以我们可以设置一个标志变量flag来进行对判断】
public void bubblbubbleSort(int[] arr) {
		for (int i = arr.length-1; i > 0; i--) {
			boolean flag=true;
			for (int j = 0; j < i; j++) {
				if(arr[j]>arr[j+1]) {
					int temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
					flag=false;
				}
			}
			if(flag) {
				break;
			}
		}

 插入排序、希尔排序

(1)插入排序:

 

 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

大致思路:

1.假设数组的第一个数据,即下标为0的数据是已经排好顺序的。

2.依次提取下标1到最后一个下标的数据,将该数据与此下标之前数据进行比较大小,将其插入到

此下标之前的数列当中的合适位置。

	public void insertSort(int[] arr) {
		for (int i = 1; i < arr.length; i++) {
			int t=arr[i];
			int j;
			for (j = i-1; j >=0 && t<arr[j]; j--) {
				arr[j+1]=arr[j];
			}
			arr[j+1]=t;
		}
	}

(2)希尔排序

D. L. Shell在1959年提出,又称为缩小增量排序。

基本思想:“跳跃式”的插入排序,在数据基本有序时,可以减少

比较和复制的次数

希尔排序是对插入排序的进一步改进

采用了分组的思想,按照一定的步长将数组进行划分。

	public void shellSort(int[] arr) {
		int d=arr.length;
		while((d/=2)>=1) {
			shellSort(arr,d);
		}
	}
	public void shellSort(int[] arr, int d) {
		for (int i = d; i < arr.length; i++) {
			int t=arr[i];
			int j;
			for (j = i-d; j>=0 && t<arr[j]; j-=d) {
				arr[j+d]=arr[j];
			}
			arr[j+d]=t;
		}
	}

直接选择排序

 每次遍历未排序的数组将数组当中最小的元素放在未排序数组的部分的第一个元素

	public void selectMinSort(int[] a) {
		int n=a.length-1;
		for (int i = 0; i < n; i++) {
			int pos=i;
			for (int j = i+1; j <=n; j++) {
				if(a[pos]>a[j]) {
					pos=j;
				}
			}
			int temp=a[i];
			a[i]=a[pos];
			a[pos]=temp;	
		}
	}

 本文图片参考:排序讲解

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值