五種排序(冒泡、插入、選擇、希爾、快排)java版
阿新 • • 發佈:2018-12-04
package com.sort;
public class SortMain {
static int[] array = { 1, -3, 9, 12, 5, 7, 27, -7, 19, 3, 6, 29 };
static int length = array.length;
public static void main(String[] args) {
// TODO Auto-generated method stub
//以下全是從小大小排序
// bubbleSort();
// insertSort();
// outputData();
selectionSort();
outputData();
}
/*
* 氣泡排序-相鄰的兩個數進行比較交換值
* i=0時最小的值在最左邊, i=1把第二小的值放
*/
public static void bubbleSort() {
int length = array.length;
for (int i = 0; i < length; i++)
for (int j = 0; j < length - 1; j++) {
if (array[i] < array[j]) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
/*
* 插入排序 在排列好的列表中一個個插入
*/
public static void insertSort() {
for (int i = 1; i < length; i++) {
int j=i;
int temp = array[i];
// 在已排好的i個數組中 查詢temp
// if(temp<array[j-1])
for (j = i; j > 0 &&temp<array[j-1]; j--) {
array[j] = array[j - 1];
}
array[j]=temp;
}
}
/*
* 選擇排序 每次選好最好的值並做好位置標記並交換位置
*/
public static void selectionSort() {
for(int i=0;i<length;i++) {
int flag=i;// 將當前下標定義為最小值下標
int temp=array[i];
for(int j=i+1;j<length;j++)
if(array[j]<temp) {
temp=array[j];
flag=j;
}
if(flag!=i) {
array[flag]=array[i];
array[i]=temp;
}
}
}
// 希爾排序 減少了陣列的移動次數 再結合插入排序
public static void shellSort() {
int h = 1;
while (h < length / 3) {
h = h * 3 + 1;
}
while (h > 0) {
for (int i = h; i < length; i++) {
int j;
int temp = array[i];
// 在已排好的i個數組中 查詢temp
for (j = i; j > h - 1 && temp < array[j - h]; j -= h) {
array[j] = array[j - h];
}
array[j] = temp;
}
h = (h - 1) / 3;
}
}
/*
* 快速排序 把陣列劃分兩個子陣列 一直劃分下去 關鍵字劃分
* 具體實現自己想看程式碼 我也猜不透
*/
public static void fastsort(int left, int right) {
if (right - left <= 0)
return;
int point = array[right];
int partition = partition(left, right, point);
fastsort(left, partition - 1);
fastsort(partition + 1, right);
} public static int partition(int left, int right, int point) {
int leftPtr = left - 1;
int rightPtr = right;
while (true) {
// 將比關鍵字小的留在左端
while (leftPtr < rightPtr && array[++leftPtr] < point)
;
// 將比關鍵字大的留在右端
while (rightPtr < leftPtr && array[--rightPtr] < point)
;
if (leftPtr >= rightPtr)
break;
else {
int temp = array[leftPtr];
array[leftPtr] = array[rightPtr];
array[rightPtr] = temp;
}
}
int temp = array[leftPtr];
array[leftPtr] = array[rightPtr];
array[rightPtr] = temp;
return leftPtr;
}
// 遍歷輸出陣列
public static void outputData() {
for (int i = 0; i < length; i++) {
System.out.printf(" " + array[i]);
}
} }
static int[] array = { 1, -3, 9, 12, 5, 7, 27, -7, 19, 3, 6, 29 };
static int length = array.length;
public static void main(String[] args) {
// TODO Auto-generated method stub
//以下全是從小大小排序
// bubbleSort();
// insertSort();
// outputData();
selectionSort();
outputData();
}
/*
* 氣泡排序-相鄰的兩個數進行比較交換值
* i=0時最小的值在最左邊, i=1把第二小的值放
*/
public static void bubbleSort() {
int length = array.length;
for (int i = 0; i < length; i++)
for (int j = 0; j < length - 1; j++) {
if (array[i] < array[j]) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
/*
* 插入排序 在排列好的列表中一個個插入
*/
public static void insertSort() {
for (int i = 1; i < length; i++) {
int j=i;
int temp = array[i];
// 在已排好的i個數組中 查詢temp
// if(temp<array[j-1])
for (j = i; j > 0 &&temp<array[j-1]; j--) {
array[j] = array[j - 1];
}
array[j]=temp;
}
}
/*
* 選擇排序 每次選好最好的值並做好位置標記並交換位置
*/
public static void selectionSort() {
for(int i=0;i<length;i++) {
int flag=i;// 將當前下標定義為最小值下標
int temp=array[i];
for(int j=i+1;j<length;j++)
if(array[j]<temp) {
temp=array[j];
flag=j;
}
if(flag!=i) {
array[flag]=array[i];
array[i]=temp;
}
}
}
// 希爾排序 減少了陣列的移動次數 再結合插入排序
public static void shellSort() {
int h = 1;
while (h < length / 3) {
h = h * 3 + 1;
}
while (h > 0) {
for (int i = h; i < length; i++) {
int j;
int temp = array[i];
// 在已排好的i個數組中 查詢temp
for (j = i; j > h - 1 && temp < array[j - h]; j -= h) {
array[j] = array[j - h];
}
array[j] = temp;
}
h = (h - 1) / 3;
}
}
/*
* 快速排序 把陣列劃分兩個子陣列 一直劃分下去 關鍵字劃分
* 具體實現自己想看程式碼 我也猜不透
*/
public static void fastsort(int left, int right) {
if (right - left <= 0)
return;
int point = array[right];
int partition = partition(left, right, point);
fastsort(left, partition - 1);
fastsort(partition + 1, right);
} public static int partition(int left, int right, int point) {
int leftPtr = left - 1;
int rightPtr = right;
while (true) {
// 將比關鍵字小的留在左端
while (leftPtr < rightPtr && array[++leftPtr] < point)
;
// 將比關鍵字大的留在右端
while (rightPtr < leftPtr && array[--rightPtr] < point)
;
if (leftPtr >= rightPtr)
break;
else {
int temp = array[leftPtr];
array[leftPtr] = array[rightPtr];
array[rightPtr] = temp;
}
}
int temp = array[leftPtr];
array[leftPtr] = array[rightPtr];
array[rightPtr] = temp;
return leftPtr;
}
// 遍歷輸出陣列
public static void outputData() {
for (int i = 0; i < length; i++) {
System.out.printf(" " + array[i]);
}
} }