三种简单的排序算法

总结的三种最简单的排序算法(java实现):冒泡排序、选择排序和插入排序(默认都是从大到小排序)

冒泡排序:

算法思想:首先确定将数组## 标题的第一个元素与后一个元素比较,如果前一个比后一小则交换顺序。依次类推

需要注意使用两层循环,第二层循环的限制条件是数组长度-1-循环次数(i),这里为什么是因为每次比较前面的数都已经排好顺序了,循环一次排好一个数,而后面比较的话需要吧已经排好的减去,因此这里是(-i)

代码:

void test1() {
		Scanner sc = new Scanner(System.in);
		int[] a = new int[10];
		System.out.println("input ten numbers:");
		for (int i = 0; i < a.length; i++) {
			a[i]=sc.nextInt();
		}
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + " ");
		}
		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < a.length - i - 1; j++) {
 //第二层循环的限制条件是数组长度-1-循环次数(i),这里为什么是因为每次比较前面的数都已经排好顺序了,循环一次排好一个数,而后面比较的话需要吧已经排好的减去,因此这里是(-i)
				if (a[j] < a[j + 1]) {              
	    //交两个数的顺序采用了位运算的机制,这样交换可以少定义一个变量,而且记忆也非常方便
                    a[j] = a[j] ^ a[j + 1];
					a[j + 1] = a[j] ^ a[j + 1];
					a[j] = a[j] ^ a[j + 1];
				}
			}
		}
		System.out.println();
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + " ");
		}
	}

优化算法:

public void test() {

		for (int i = 0; i < a.length; i++) {
			boolean f = true;    //判断数组是否已经有序,若有序则不比较
			for (int j = 0; j < a.length - i - 1; j++) {
				if (a[j] < a[j + 1]) {
					a[j] = a[j] ^ a[j + 1];
					a[j + 1] = a[j] ^ a[j + 1];
					a[j] = a[j] ^ a[j + 1];
					f = false;
				}
			}
			if (f) {
				break;
			}
		}
	}

选择排序:

算法思想:选择排序的简单思路就是将第一个元素依次与后面的所有元素比较,如果小于后面元素,则交换顺序,通过第一次循环找到最大数,放在第一位,然后依次类推,开始第二次循环

代码:

void test2() {
		Scanner sc = new Scanner(System.in);
		int[] a = new int[10];
		System.out.println("input ten numbers:");
		for (int i = 0; i < a.length; i++) {
			a[i]=sc.nextInt();
		}
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + " ");
		}
		for(int i =0 ;i<a.length;i++) {
			for(int j=i+1;j<a.length;j++) {
//  选择排序与冒泡排序的差别主要是集中在第二个循环的初始条件中,起始条件是j=i+1,这里主要是因为比较的元素是第 i 个位置的后一个元素,然后依次比较。
				if(a[i]<a[j]) {
					a[i]=a[i]^a[j];
					a[j]=a[i]^a[j];
					a[i]=a[i]^a[j];
				}
		}
			}
		System.out.println();
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + " ");
		}
	}

优化算法

public void test() {
		for(int i =0;i<a.length;i++) {
			int pos=i;     //记录最大值的下标
			int max=a[i];
			for(int j =i+1;j<a.length;j++) {
				if(max<a[j]) {
					max=a[j];
					pos=j;    //找到最大数的下标
//					a[i]=a[i]^a[j];
//					a[j]=a[i]^a[j];
//					a[i]=a[i]^a[j];
				}
			}
			a[pos]=a[i];    //只交换最大的数
			a[i]=max;

		}
	}

插入排序

算法思想:插入排序他的算法就好像是我们在打扑克牌一样,摸到一张牌然后与手里的牌比较,插入到已有的序列之中,让这个序列也构成一个有序数列。然后依次类推,直到之后一张结束。

代码:

void test3() {
		Scanner sc = new Scanner(System.in);
		int[] a = new int[10];
		System.out.println("input ten numbers:");
		for (int i = 0; i < a.length; i++) {
			a[i]=sc.nextInt();
		}
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + " ");
		}
		for(int i =1;i<a.length;i++) {
			int temp=a[i];
			for(int j =i;j>0;j--) {
//这里开始的循环时从1开始,因为一开始一个数本来就是有序数列,内层循环是让j=i,表示现有的数据数量,然后依次比较,直到j=0,表示已经全部比较完毕,开始新的一轮循环
				if(temp<a[j-1]) {
					int t =a[j-1];
					a[j-1]=temp;
					a[j]=t;
				}
			}
		}
		System.out.println();
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + " ");
		}
	}

优化算法:

public void test() {
		for (int i = 1; i < a.length; i++) {
			int temp = a[i];
			int j;
			for (j = i; j > 0 && a[j - 1] > temp; j--){//讲if判断直接放入循环
				a[j] = a[j - 1];
			}
			a[j] = temp;
		}
	}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值