总结的三种最简单的排序算法(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;
}
}