1. 程式人生 > >六大演算法: 插入、選擇、冒泡、快速、二分、水桶

六大演算法: 插入、選擇、冒泡、快速、二分、水桶

*************************氣泡排序******************************

int[] arr = {5, 1, 2, 3, 7, 8, 6, 4};

int flag = 0;//0代表無序,1代表有序

//外迴圈決定需要幾次冒泡

for(int i = 0 ;i<arr.length-1 && flag == 0;i++)

{ //假定資料有序

flag = 1;

//內迴圈決定一次冒泡的過程

for(int j=0;j<arr.length-1-i;j++)

//氣泡排序的核心演算法,兩兩比較,滿足條件交換

{

if(arr[j]>arr[j+1])

{

int t = arr[j];

arr[j] = arr[j+1];

arr[j+1] = t;

//確定無序

flag = 0;

}

}

}

for(int i =0; i<arr.length;i++)

{

System.out.print(arr[i]+" ");

}

}

*************************選擇排序******************************

排序原理圖如下

public class Tex {

public static void main(String[] args) {

int[] arr = {6, 7, 2, 1, 3, 8, 9};

for (int i = 0; i < arr.length; i++) {

int minIndex = i;//假定最小數的下標是第一個

for (int j = i; j < arr.length; j++) {

if(arr[minIndex] > arr[j]){

minIndex = j;

}

}

System.out.println("下標為"+minIndex+"最小值為"+arr[minIndex]);

int temp = arr[i];

arr[i] = arr[minIndex];

arr[minIndex] = temp;

}

for (int i = 0; i < arr.length; i++) {

System.out.print(arr[i]+" ");

}

}

}

插入排序原理

*************************插入排序******************************

public class insert1 {

public static void main(String[] args) {

int[] arr = {5, 7, 2, 1, 3, 6, 9};

//插入排序

for (int i = 1; i < arr.length; i++) {

int j =i;

int temp = arr[j];//取得有序區最後一個元素的值,進入二層迴圈

while ( j>0 && temp < arr[j-1]){//判斷無序區下標(j > 0)不能溢位,判斷和前一個數比較

arr[j] = arr[j-1];//進入迴圈,為要插入的資料留空間,陣列後移一位

j--;//下標遞減

}

arr[j] = temp;//最後和有序區最後一個元素交換

for (int k = 0; k < arr.length; k++) {

System.out.print(arr[k]+" ");}

System.out.println();

}

for (int i = 0; i < arr.length; i++) {

System.out.print(arr[i]+" ");

}

}

}

*************************水桶排序******************************

public class Barril {

public static void main(String[] args) {

int[] arr = {5, 7, 2, 1, 3, 6, 9};

int[] arr1 = new int[10];

for(int i = 0; i < arr.length; i++){

arr1[arr[i]]++;

}

for (int i = 0; i < arr1.length; i++) {

}

for(int i = 0 ; i < arr1.length; i++)

for(int j = 0; j < arr1[i]; j++){

System.out.print(i);

}

}

}

*************************二分查詢******************************

必須是有序數列

public static int binarrySeek(int target, int[] src) {

int start = 0;

int end = src.length - 1;

while (start <= end) {

int mid = (start + end) / 2;

if(target > src[mid]){

start = mid +1;

}else if (target < src[mid]) {

end = mid - 1;

} else {

return mid;

}

}

return -1;

}

}

*************************二分查詢******************************

//折半查詢

public static int binarrySeek(int target, int[] src) {

int start = 0;

int end = src.length - 1;

while (start <= end) {

int mid = (start + end) / 2;

if(target > src[mid]){

start = mid +1;

}else if (target < src[mid]) {

end = mid - 1;

} else {

return mid;

}

}

return -1;

}

*************************快速查詢(遞迴)***************************

public static void quickSort(int[] src, int start , int end) {//start和end 是為了遞迴

if(start >= end) {

//只有一個一下元素,返回

return;

}

int s = start;//定義起點

int e = end;//定義終點

//選出start指向的元素作為基準值

int temp = src[s];

while (s < e) { //起點和終點不重合

while (s < e &&src[e] > temp) { //開始都在基準值右邊 當前資料合格 start < end 防止end-過頭

e--;//大於基準值不動

}

if (s == e) {

break;//表示基準值找到了位置

}

src[s] = src[e];//小於src【s】的值放在src【s】左右

s++;

while (s < e && src[s] < temp) {//當前資料合格

s++;

}

if (s == e) {

break;

}

src[e] = src[s];

e--;

}

src[s] = temp;//起點終點重合,基準值找到了自己的位置

quickSort(src, start, s - 1);

quickSort(src, s + 1, src.length - 1);

}

*************************快速查詢(非遞迴)**************************

import java.util.Arrays;

import java.util.LinkedList;

public class Demo2 {

public static void main(String[] args) {

int a[] = { 1, 3, 4, 2, 5, 7, 6, 9, 8, 10 };

quickSort(a);

System.out.println(Arrays.toString(a));

}

public static void quickSort(int[] a) {

int[] range = { 0, a.length - 1 };

LinkedList<int[]> stack = new LinkedList<int[]>();

stack.offerLast(range);

while (!stack.isEmpty()) {

int[] r = stack.pollLast();

int start = r[0];

int end = r[1];

int temp = a[start];

while (start < end) {

while (start < end && a[end] > temp) {

end--;

}

if (start == end) {

break;

}

a[start] = a[end];

start++;

while (start < end && a[start] < temp) {

start++;

}

if (start == end) {

break;

}

a[end] = a[start];

end--;

}

a[start] = temp;

if (r[0] < start - 1) {

stack.offerLast(new int[] { r[0], start - 1 });

}

if (r[1] > start + 1) {

stack.offerLast(new int[] { start + 1, r[1] });

}

}

}

}