排序算法(一):冒泡、选择、插入的JAVA实现
常见的8大排序算法分类如下:
冒泡、选择、插入属于最基本的排序算法,其时间复杂度为O(n^2)。
一、冒泡
1.1基本思路
(1)第一轮比较:以从小到大的顺序,数组第一个数据与第二个数据比较,较大值放在后面,即第二个位置
(2)接着比较数组第2个数据与第3个数据,较大值放在后面。
(3)接着比较数组第3个数据与第4个数据,较大值放在后面,依次类推。
(4)第二轮比较:同第一轮的做法,但只比较到数组倒数2、3的位置,因为数组最后一个位置已放了最大值
(5)同理进行N轮,N=数组长度-1。
1.2代码
private void bubble(int[] arr) {
int temp;
boolean flag = false;
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp; flag=true;
}
}
if (flag==false){
break;
}else{
flag=false;
}
}
}
上述用了标志,如果有一次冒泡没有任何的数据交换,实际上数组已经有序,可以退出。
二、简单选择
2.1基本思路
(1)以从大到小的顺序,将第一个数据与数组其他数据进行比较,最大值放在arr[0];
(2)第二个数据与其后数组其他数据进行比较,最大值放在arr[1];同理其他
(3)总共需要遍历n-1次,每次遍历从当前值下一个开始比较。
2.2代码
private void select(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i+1; j < arr.length ; j++) {
if (arr[i]< arr[j ]) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
上述代码进行了所有数据的比较,实际上,可以记录最值及下标
private void select2(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int mindex=i; //下标
int min=arr[i];//最值
for (int j = i+1; j < arr.length ; j++) {
if (min< arr[j ]) {
min = arr[j];
mindex=j;
}
}
if (mindex != i) {
arr[mindex] = arr[i];
arr[i] = min;
}
}
}
三、直接插入
3.1基本思路
(1)假设数组共N个数据,分成数组长度为1、N-1两个有序数列,每次从第二个数列中取出一个数据,取出的数据与第一个数列比较,进行插入,直到第二个数列没有数据。
(2)共需插入N-1次。
3.2代码
public void insert(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int value = arr[i]; //从待插入的数列取数据 ,从i=1开始
int index = i - 1;
while (index >= 0 && value < arr[index]) {//与第一个数列中 最后一个比,
arr[index + 1] = arr[index];
index--; //满足条件后,与第一个数列中倒数第二个比,直至退出循环
}
arr[index + 1] = value;
System.out.println("di" + i);
System.out.println(Arrays.toString(arr));
}
}
经历了四次插入,第一轮 3 9比较,第二轮 3 9(已有序) -1 比较,第三轮 -1 3 9(已有序) 10比较…
PS:学自尚硅谷的总结,打call,下同!