冒泡排序:
package sort.bubblesort;
import java.util.Random;
/**
* @program: dataStructures_algorithms
* @description: 冒泡排序
* @author: Sun
* @create: 2020/01/10 16:52
* @version: 1.0
*/
public class BubbleSort {
/**
* @param arr: 需要排序的数组
* @return void
* @Description: 冒泡排序,此种交换方法速度更慢,不建议使用
*/
public static void sort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
arr[j] = arr[j] + arr[j + 1];
arr[j + 1] = arr[j] - arr[j + 1];
arr[j] = arr[j] - arr[j + 1];
}
}
}
}
/**
* @param arr: 需要排序的数组
* @return void
* @Description: 优化后的冒泡排序
*/
public static void opSort(int[] arr) {
boolean flag = false;
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
flag = true;
arr[j] = arr[j] + arr[j + 1];
arr[j + 1] = arr[j] - arr[j + 1];
arr[j] = arr[j] - arr[j + 1];
}
}
if (!flag) { // 如果排序过程中,一次交换都没有发生,说明数组已经有序,直接结束排序
break;
} else {
flag = false;
}
}
}
public static void main(String[] args) {
int[] arr = new int[80000];
Random r = new Random();
for (int i = 0; i < 80000; i++) {
arr[i] = r.nextInt(8000000);
}
long start = System.currentTimeMillis();
opSort(arr);
long time = (System.currentTimeMillis() - start) / 1000;
System.out.println(time + " s");
}
}
选择排序:
package sort.selectSort;
import java.util.Random;
/**
* @program: dataStructures_algorithms
* @description:选择排序
* @author: Sun
* @create: 2020/01/10 17:46
* @version: 1.0
*/
public class SelectSort {
/**
* @param arr: 需要排序的数组
* @return void
* @Description: 选择排序,不在循环内直接交换会显著提高效率
*/
public static void sort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int index = i;
int min = arr[i];
for (int j = i + 1; j < arr.length; j++) {
if (min > arr[j]) {
index = j;
min = arr[j];
}
if (index != i){
arr[index] = arr[i];
arr[i] = min;
}
}
}
}
public static void main(String[] args) {
int[] arr = new int[80000];
Random r = new Random();
for (int i = 0; i < 80000; i++) {
arr[i] = r.nextInt(8000000);
}
long start = System.currentTimeMillis();
sort(arr);
long time = (System.currentTimeMillis() - start) / 1000;
System.out.println(time + "s");
}
}
插入排序:
package sort.insertSort;
import java.util.Random;
/**
* @program: dataStructures_algorithms
* @description: 插入排序
* @author: Sun
* @create: 2020/01/10 19:23
* @version: 1.0
*/
public class InsertSort {
/**
* @Description: 插入排序,看成一个有序列表跟一个无序列表,每次在无序列表中拿出一个元素插入到
* 有序列表中的顺序位置当中,主要通过获取下标来进行赋值操作
* @param arr: 需要排序的数组
* @return void
*/
public static void sort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int insertValue = arr[i];
int insertIndex = i - 1;
while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex + 1] = insertValue;
}
}
public static void main(String[] args) {
int[] arr = new int[80000];
Random r = new Random();
for (int i = 0; i < 80000; i++) {
arr[i] = r.nextInt(8000000);
}
long start = System.currentTimeMillis();
sort(arr);
long time = (System.currentTimeMillis() - start);
System.out.println(time + "ms");
}
}