六大演算法: 插入、選擇、冒泡、快速、二分、水桶
*************************氣泡排序******************************
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] });
}
}
}
}