java算法5——选择、插入、冒泡排序

1、选择排序

  将要排序的对象分作两部份,一个是已排序的,一个是未排序的,从后端未排序部份选择一个最小值,并放入前端已排序部份的最后一个,例如:

排序前:70 80 31 37 10 1 48 60 33 80
    [1] 80 31 37 10 70 48 60 33 80 选出最小值1
    [1 10] 31 37 80 70 48 60 33 80 选出最小值10
    [1 10 31] 37 80 70 48 60 33 80 选出最小值31
    [1 10 31 33] 80 70 48 60 37 80 …
    [1 10 31 33 37] 70 48 60 80 80 …
    [1 10 31 33 37 48] 70 60 80 80 …
    [1 10 31 33 37 48 60] 70 80 80 …
    [1 10 31 33 37 48 60 70] 80 80 …
    [1 10 31 33 37 48 60 70 80] 80 …

2、插入排序

  像是玩朴克一样,我们将牌分作两堆,每次从后面一堆的牌抽出最前端的牌,然后插入前面一堆牌的适当位置,例如:

排序前:92 77 67 8 6 84 55 85 43 67
    [77 92] 67 8 6 84 55 85 43 67 将77插入92前
    [67 77 92] 8 6 84 55 85 43 67 将67插入77前
    [8 67 77 92] 6 84 55 85 43 67 将8插入67前
    [6 8 67 77 92] 84 55 85 43 67 将6插入8前
    [6 8 67 77 84 92] 55 85 43 67 将84插入92前
    [6 8 55 67 77 84 92] 85 43 67 将55插入67前
    [6 8 55 67 77 84 85 92] 43 67 …
    [6 8 43 55 67 77 84 85 92] 67 …
    [6 8 43 55 67 67 77 84 85 92] …

3、冒泡排序

  顾名思义,就是排序时,最大的元素会如同气泡一样移至右端,其利用比较相邻元素的方法,将大的元素交换至右端,所以大的元素会不断的往右移动,直到适当的位置为止。基本的气泡排序法可以利用旗标的方式稍微减少一些比较的时间,当寻访完阵列后都没有发生任何的交换动作,表示排序已经完成,而无需再进行之后的回圈比较与交换动作,例如:

排序前:95 27 90 49 80 58 6 9 18 50
    27 90 49 80 58 6 9 18 50 [95] 95浮出
    27 49 80 58 6 9 18 50 [90 95] 90浮出
    27 49 58 6 9 18 50 [80 90 95] 80浮出
    27 49 6 9 18 50 [58 80 90 95] …
    27 6 9 18 49 [50 58 80 90 95] …
    6 9 18 27 [49 50 58 80 90 95] …
    6 9 18 [27 49 50 58 80 90 95] 由于接下来不会再发生交换动作,
排序提早结束在上面的例子当中,还加入了一个观念,就是当进行至i与i+1时没有交换的动作,表示接下来的i+2至n已经排序完毕,这也增进了气泡排序的效率。冒泡排序分为小冒泡和大冒泡,这里是大冒泡,个人认为选择排序和冒泡排序类似,选择排序是查找最小的放到数组前方,冒泡排序是选择最大的放到数组后方,小冒泡思想就和选择排序一样了。

4、代码:

import java.util.Arrays;

public class Select_Insort_Bub_sort {
	public static void main(String[] args) {
		int[] data = {70,80,31,37,10,1,48,60,33,80};
		//select(data);
		//insort(data);
		bub(data);
		System.out.println(Arrays.toString(data));
	}
	
	//选择排序
	public static void select(int[] data) {
		int p =0;
		int p1 =0;
		int min= data[p];
		for(;;) {
			p1 = p;//p1指针归位
			//找剩余数最小值
			for(int p_1=p;p_1<data.length;p_1++) {
				if(data[p_1]<min) {
					min = data[p_1];
					p1=p_1;
				}
			}
			
			//向后移动
			for(int p_2=p1;p_2>p;p_2--) {
				data[p_2] = data[p_2-1];
			}
			
			data[p]=min;
			p++;
			min = data[p];
			if(p==(data.length-1))break;
		}	
	}
		
	//插入排序
	public static void insort(int[] data) {
		int x = 0;
		int y;
		for(int p=1;p<data.length;p++) {
			for(int p1=0;p1<=x;p1++) {
				if(data[p]<data[p1]) {
					y = data[p];
					for(int p2=p;p2>p1;p2--) {
						data[p2]=data[p2-1];
					}
					data[p1]=y;
					x++;
					break;
				}
			}
			
		}
	}
	
	//冒泡排序
	public static void bub(int[] data) {
		int end_p = data.length-1;
		int max_p = end_p;
		int max = data[end_p];
		while(true) {
			//找出最大值
			for(int x=0;x<end_p;x++) {
				if(data[x]>max) {
					max=data[x];
					max_p=x;
				}
			}
			//移动数组
			for(int x=max_p;x<end_p;x++) {
				data[x]=data[x+1];
			}
			
			//最大数字移动到后边,指针和最大值初始化
			{
				data[end_p]=max;
				end_p--;
				max_p=end_p;
				max= data[end_p];
			}
			
			if(end_p==0)break;
		}
		
	}

}

你可能感兴趣的:(基础算法,java,算法)