目录
1、简单排序
时间复杂度都是:O(N^2)
1.1、冒泡排序
原理:比较相邻两个元素,大的放在后面
例:此题时间复杂度为:O((n-1)^2)=O(25)
package paixu;
import java.util.Arrays;
//冒泡排序法
public class Maopao {
public static void main(String[] args) {
//初始数组
int[] a = {6,5,4,3,2,1};
for(int i=0; i<a.length-1;i++) {
for(int j=0; j<a.length-1;j++) {
if(a[j+1]<a[j]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(a));
}
}
1.2、选择排序
原理:每次遍历,先假定一个索引是最小值的索引,然后去与剩下的数进行比较,找出最小值的索引,将最小值与初始值进行交换。
package paixu;
import java.util.Arrays;
//选择排序
public class Xuanze {
public static void main(String[] args) {
int[] a = {6,5,4,3,2,1};
for(int i=0; i<a.length-1; i++) {
int min = i;
for(int j=i+1; j<a.length; j++) {
if(a[min]>a[j]) {
min = j;
}
}
int temp = a[i];
a[i]=a[min];
a[min]=temp;
}
System.out.println(Arrays.toString(a));
}
}
1.3、插入排序
原理:可以将数组分成两类:已排序、未排序
让未排序的第一个值,与已排序从右向左比较,如果小就交换值,如果大,放入已排序,进行下一次循环
package paixu;
import java.util.Arrays;
//插入排序
public class Charu {
public static void main(String[] args) {
int[] a = {6,5,4,3,2,1};
for(int i=0; i<a.length-1; i++) {
for(int j=i; j>=0; j--) {
if(a[j]>a[j+1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}else {
break;
}
}
}
System.out.println(Arrays.toString(a));
}
}
2、高级排序
1)希尔排序
插入排序的优化版
原理:选定好一个增长值h(索引之间的差),进行分组,对分好的每一组进行插入排序,减少h,直到1,重复插入操作
package paixu;
import java.util.Arrays;
//希尔排序
public class Xier {
public static void main(String[] args) {
int[] a = {6,5,4,3,2,1};
//确定h最大增长量
int h=1;
while(h<a.length/2) {
h = h*2+1;
}
while(h>=1) {
//找到待插入元素
for(int i=h; i<a.length; i++) {
for(int j=i; j>=h; j-=h) {
if(a[j]<a[j-h]) {
int temp = a[j-h];
a[j-h] = a[j];
a[j] = temp;
}else {
break;
}
}
}
//减小h
h = h/2;
}
System.out.println(Arrays.toString(a));
}
}
希尔排序与插入排序
package paixu;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Xier_li {
public static void main(String[] args) throws IOException {
long begin = System.currentTimeMillis();
BufferedReader br = new BufferedReader(new FileReader("src\\reverse.txt"));
List<Integer> list = new ArrayList<>();
String s = null;
while((s=br.readLine())!=null) {
int a = Integer.parseInt(s);
list.add(a);
}
br.close();
Integer[] b = new Integer[list.size()];
list.toArray(b);
//插入排序:30482 毫秒
charu(b);
//希尔排序:56 毫秒
//xier(b);
long end = System.currentTimeMillis();
System.out.println((end-begin)+" 毫秒");
}
public static void xier(Integer[] b) {
int h=1;
while(h<b.length/2) {
h = h*2+1;
}
while(h>=1) {
for(int i=h; i<b.length; i++) {
for(int j=i; j>=h; j-=h) {
if(b[j-h]>b[j]) {
int temp = b[j-h];
b[j-h] = b[j];
b[j] = temp;
}else {
break;
}
}
}
h = h/2;
}
}
public static void charu(Integer[] b) {
for(int i=0; i<b.length-1; i++) {
for(int j=i; j>=0; j--) {
if(b[j]>b[j+1]) {
int temp = b[j];
b[j] = b[j+1];
b[j+1] = temp;
}else {
break;
}
}
}
}
}