堆排序 、 快速排序 、 希尔排序 、 直接选择排序 是不稳定的排序算法,而 冒泡排序 、 直接插入排序 、 折半插入排序 、 归并排序 是稳定的排序算法。
1.冒泡排序(O(n^2))【括号内为时间复杂度】
package mian.Text;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
//80000万个数据检测速度:冒泡在该机器上用时:13秒
public class maopao {
public static void main(String[] args) {
// int [] arr = {1,2,3,4,5};
// int [] arr = {1,3,2,4,5};
// int [] arr = {3,9,-1,10,20};
int [] arr = new int[80000];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random()*80000);
}
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = format.format(date);
System.out.println(s);
int temp = 0;
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;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
if (!flag){
// System.out.println("该数组已经排序完毕");
break;
}else {
flag = false;
}
// System.out.println("第"+(i+1)+"次排序");
// System.out.println(Arrays.toString(arr));
}
System.out.println("=====================================================");
Date date2 = new Date();
SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String ss = format2.format(date2);
System.out.println(ss);
}
}
2.选择排序 (O(n^2))
package mian.Text;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
//80000万个数据检测速度:选择在该机器上用时:4秒
public class SelectSorting {
public static void main(String[] args) {
int []arr = {101,34,119,1,-1,90,123};
// int [] arr = new int[80000];
// for (int i = 0; i < arr.length; i++) {
// arr[i] = (int) (Math.random()*80000);
// }
// Date date = new Date();
// SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// String s = format.format(date);
// System.out.println(s);
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
int min = arr[i];
boolean flag = false;
for (int j = i+1; j < arr.length; j++) {
if (min>arr[j]){
min = arr[j];
minIndex = j;
}
}
if (minIndex!=i){
flag = true;
arr[minIndex] = arr[i];
arr[i] = min;
}
if (flag){
System.out.println("第"+(i+1)+"次");
System.out.println(Arrays.toString(arr));
}else {
System.out.println("已是正确排序");
break;
}
}
// System.out.println("=====================================================");
// Date date2 = new Date();
// SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// String ss = format2.format(date2);
// System.out.println(ss);
// System.out.println(Arrays.toString(arr));
}
}
3.插入排序 (O(n^2))
package mian.Text;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
//插入排序
//80000万个数据检测速度:插入在该机器上用时:2秒
public class InsertSort {
public static void main(String[] args) {
// int []arr = {6,5,4,3,2,1};
int [] arr = new int[80000];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random()*80000);
}
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = format.format(date);
System.out.println(s);
int insertVal = 0 ;
int index = 0;
for ( int i= 1; i < arr.length; i++) {
insertVal = arr[i];//要和前边对比的数
index = i -1 ;//它的下标索引
while (index >=0 && insertVal<arr[index]){
arr[index+1] = arr[index];
index--;
}
if(index + 1 == i){
arr[index+1] = insertVal;
}
// System.out.println("第"+i+"次");
// System.out.println(Arrays.toString(arr));
}
System.out.println("=====================================================");
Date date2 = new Date();
SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String ss = format2.format(date2);
System.out.println(ss);
}
}
4.希尔排序(O(nlogn))
package mian.Text;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
80000万个数据检测速度:希尔排序在该机器上用时:不到1秒
public class shellSort {
public static void main(String[] args) {
// int []arr = {6,5,4,3,2,1};
int count = 0;
int [] arr = new int[80000];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random()*80000);
}
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = format.format(date);
System.out.println(s);
for (int gap = arr.length/2; gap > 0; gap/=2) {
for ( int i= gap; i < arr.length; i++) {
int index = i;
int temp = arr[index];
if (arr[index]<arr[index-gap]){
while (index - gap >=0 && temp<arr[index - gap]){
arr[index] = arr[index-gap];
index-=gap;
}
}
arr[index] = temp;
// System.out.println("第"+(++count)+"次");
// System.out.println(Arrays.toString(arr));
}
}
System.out.println("=====================================================");
Date date2 = new Date();
SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String ss = format2.format(date2);
System.out.println(ss);
}
}
5.归并排序(O(nlogn))
package mian.Text;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
80000万个数据检测速度:归并排序在该机器上用时:不到1秒
public class MergeSort {
public static void main(String[] args) {
// int [] arr = {3,1,4,6,7,894,2,154,6,34};
int [] arr = new int[80000];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random()*80000);
}
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
String s = format.format(date);
System.out.println(s);
int []temp = new int[arr.length];
mergeSort(arr,0,arr.length-1,temp);
System.out.println("=====================================================");
Date date2 = new Date();
SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
String ss = format2.format(date2);
System.out.println(ss);
// System.out.println(Arrays.toString(arr));
}
public static void mergeSort(int []arr,int left,int right,int[] temp){
if (left<right){
int mid = (left+right) / 2;
mergeSort(arr,left,mid,temp);
mergeSort(arr,mid+1,right,temp);
merge(arr,left,mid,right,temp);
}
}
public static void merge(int []arr,int left,int mid,int right,int[] temp){
int i =left;
int j = mid+1;
int t = 0;
while (i<=mid && j<=right){
if (arr[i]<=arr[j]){
temp[t] = arr[i];
i++;
t++;
}else {
temp[t] = arr[j];
j++;
t++;
}
}
while (i <= mid){
temp[t] = arr[i];
i++;
t++;
}
while (j <= right){
temp[t] = arr[j];
j++;
t++;
}
t = 0;
int templeft = left;
while (templeft<=right){
arr[templeft] = temp[t];
templeft++;
t++;
}
}
}
6.快排(O(nlogn))
package mian.Text;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
80000万个数据检测速度:快排在该机器上用时:不到1秒
public class QuickSort{
public static void main(String[] args) {
// int [] arr = {9,8,7,6,54,3,2,1};
int count = 0;
int [] arr = new int[8];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random()*80000);
}
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = format.format(date);
System.out.println(s);
quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
System.out.println("=====================================================");
Date date2 = new Date();
SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String ss = format2.format(date2);
System.out.println(ss);
}
public static void quickSort(int[] arr,int left,int right){
if (left>=right){//只有一个数
return;
}
int l = left;
int r = right;
int pivot = arr[left];
while (l < r){
while (l<r && arr[r]>=pivot){
r--;
}
if (l<r){
arr[l] = arr[r];
}
while (l<r && arr[l]<=pivot){
l++;
}
if (l<r){
arr[r] = arr[l];
}
if (l == r){
arr[l] = pivot;
}
}
quickSort(arr,left,l-1);
quickSort(arr,l+1,right);
}
}
7.基数排序(n*k)(k:桶子数)
package mian.Text;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.SimpleTimeZone;
//基数排序 80000个数据速度测试:<1秒
public class RadixSort {
public static void main(String[] args) {
// int []arr = {53,3,542,748,14,214};
int []arr = new int[80000];
for (int i = 0; i < 80000; i++) {
arr[i] = (int) (Math.random()*80000);
}
Date date = new Date();
SimpleDateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = dateFormat.format(date);
System.out.println(format);
int [][]arrays = new int[10][arr.length];
//array[?]就代表第几个桶里有多少数字,只是一个计数的数组
int []array = new int[10];
int temp = 0;
int lmx = 0;
// radixSort(arr, arrays, array, temp, lmx);
Date date1 = new Date();
SimpleDateFormat dateFormat1 =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format1 = dateFormat1.format(date1);
System.out.println(format1);
}
private static void radixSort(int[] arr, int[][] arrays, int[] array, int temp, int lmx) {
//找最大值
for (int i = 0; i < arr.length; i++) {
if (temp<arr[i]){
temp = arr[i];
}
}
//执行几次
int count = 0;
while (temp>0){
temp = temp/10;
count++;
}
for (int i = 0,n = 1; i < count; i++, n*=10) {
//放
for (int j = 0; j < arr.length; j++) {
int a = arr[j] / n %10;
arrays[a][array[a]] = arr[j];
array[a]++;
}
//取
for (int q = 0; q < array.length; q++) {
if (array[q]!= 0){
for (int k = 0; k < array[q]; k++) {
arr[lmx++] = arrays[q][k];
}
}
//把桶清空
array[q] = 0;
}
lmx = 0;
System.out.println(Arrays.toString(arr));
}
}
}