排序
排序知识很多,我今天心血来潮突然复习一下,顺便给自己总结一下。
堆排之后补
import java.util.Scanner;
public class Sort {
static int[] num;
static void swap(int a, int b) {
int temp = num[a];
num[a] = num[b];
num[b] = temp;
}
static void bubbleSort(int len) {
//普通冒泡
for(int i = 0; i < len-1; i++) {
for(int j = len-2; j >= i; j--)
if(num[j] > num[j+1])
swap(j, j+1);
}
}
static void bubbleSort1(int len) {
//冒泡加个flag提前跳出循环
boolean flag = true;
for(int i = 0; i < len-1; i++) {
for(int j = len-2; j >= i; j--) {
if(num[j] > num[j+1]) {
swap(j, j+1);
flag = false;
}
}
if(flag)
return ;
}
}
static void insertSort(int len) {
//直接插入排序,最原始做法
for(int i = 1; i < len; i++) {
for(int j = i; j >= 1; j--) {
if(num[j-1] > num[j])
swap(j-1, j);
else
break;
}
}
}
static void insertSort1(int len) {
//小优化的插排,把交换过程优化了一下
for(int i = 1; i < len; i++) {
if(num[i-1] <= num[i])
continue;
int temp = num[i];
int j;
for(j = i; j >= 1; j--) {
if(num[j-1] > temp)
num[j] = num[j-1];
else
break;
}
num[j] = temp;
}
}
static void shellSort(int len) {
//希尔排序,就改变增量,简单不谈了
int d = len-1;
while(d > 1) {
d = d/2;
for(int i = d; i < len; i++) {
if(num[i-d] <= num[i])
continue;
int temp = num[i];
int j;
for(j = i; j >= d; j-=d) {
if(num[j-d] > temp)
num[j] = num[j-d];
else
break;
}
num[j] = temp;
display(len);
}
}
}
static void quickSort(int l, int r) {
//最原始的快排手段
if(l >= r)
return ;
int left = l;
for(int i = l+1; i <= r; i++) {
if(num[i] < num[l]) {
swap(i, ++left);
}
}
swap(left, l);
quickSort(l, left-1);
quickSort(left+1, r);
}
static void quickSort1(int i, int j) {
//书上抄来的,也是优化了交换的过程
//我个人改成了随机二路快排,避免数据极差情况,例如5 4 3 2 1
int l = i, r = j;
int k = num[(int)(Math.random()*(j-i))+i];
if(l >= r) {
return ;
}
while(l < r) {
while(l < r && num[r] > k)
r--;
if(l < r){
num[l] = num[r];
l++;
}
while(l < r&&num[l] < k)
l++;
if(l < r) {
num[r] = num[l];
r--;
}
}
num[l] = k;
quickSort(i, l-1);
quickSort(l+1, j);
}
static void quickSort2(int l, int r) {
//三路快排,与基数相等的不进入递归,避免数据量极差 例如 4 4 4 5 5 2
if(l >= r)
return ;
int left = l-1;
int right = r+1;
int k = num[(int)(Math.random()*(r-l))+l];
int i = l;
while(i < right) {
if(num[i] < k)
swap(++left, i++);
else if(num[i] > k)
swap(--right, i);
else i++;
}
System.out.println(k);
quickSort(l, left);
quickSort(right, r);
}
static void mergeArray(int left, int mid, int right) {
//归并我好像没学到哪些小优化= =
int[] temp = new int[right-left+1];
int i = 0, l = left, r = mid+1;
while(l <= mid && r <= right) {
if(num[l] < num[r]) {
temp[i] = num[l];
i++;
l++;
}else {
temp[i] = num[r];
i++;
r++;
}
}
//把剩下的都放过去
while(l <= mid) {
temp[i] = num[l];
i++;
l++;
}
while(r <= right){
temp[i] = num[r];
r++;
i++;
}
i= 0;
for(int j = left; j <= right; j++) {
num[j] = temp[i];
i++;
}
return ;
}
static void mergeSort(int l , int r) {
if(l == r) {
return ;
}
int mid = (r-l)/2+l;
mergeSort(l, mid);
mergeSort(mid+1, r);
mergeArray(l, mid, r);
}
static void display(int len) {
for(int i = 0; i < len; i++)
System.out.print(num[i] + " ");
System.out.println();
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = 10;
num = new int[n];
for(int i = 0; i < n; i++) {
num[i] = (int)(Math.random()*100) + 1;
}
System.out.println("==================================================");
}
}
由于内容简单,我就不加以注释了