Java【快速排序、插入排序、简单选择排序...】【八大排序-综合实验】
目? ?錄
1、快速排序
1.1、概念+舉例
1.2、完整代碼
2、插入排序
2.1、概念+舉例
2.2、完整代碼
3、簡單選擇排序
3.1、概念+舉例
3.2、完整代碼
4、3種排序-綜合代碼
4.1、完整代碼
4.2、運行截圖
5、其它排序算法匯總
1、快速排序
1.1、概念+舉例
low、high重合,數組按照基數分配完畢。比基數大的數字,在右邊;比基數小的數字,在左邊;繼續遞歸。
設定一個基準數a。【通常取第一個數字!】
比a大的數字,往右移動;比a小的數字,往左移動!遞歸!!!
設置 前后 2個 標記,標記重合,進行下一次 遞歸!【遞歸結束條件:開始位置==結束位置】
1.2、完整代碼
package demo4;import java.util.Arrays;public class QuickSort {public static void main(String[] args) {int[] arr = new int[] { 3, 4, 6, 7, 2, 7, 2, 8, 0, 9, 1 };quickSort(arr, 0, arr.length - 1);System.out.println(Arrays.toString(arr));}// 快速排序public static void quickSort(int[] arr, int start, int end) {if (start < end) {int stard = arr[start]; // 把數組中的第0個數字做為標準數【從數組的開始位置取標準數】int low = start; // 記錄坐標-記錄需要排序的下標int high = end; // 記錄坐標while (low < high) { // 循環找比標準數大的數和比標準數小的數【高右低左】// 1、右邊的數字比標準數大,則數字不需要移動,high--// stard <= arr[high]:基準數要小于右邊指針所指的數字while (low < high && stard <= arr[high]) {high--;//基準數小于右邊指針所指的數字,high--前移}arr[low] = arr[high];// 使用右邊的數字替換左邊的數// 2、如果左邊的數字比標準數小,則數字不需要移動,low++while (low < high && arr[low] <= stard) {low++;//下標右移}arr[high] = arr[low];}// low、high重合---把標準數賦給低所在的位置的元素arr[low] = stard;// low、high重合---根據low與high所在的下標-處理所有的小的數字-從開始位置~低的位置quickSort(arr, start, low);// low、high重合---根據low與high所在的下標-處理所有的大的數字-從開始位置~高的位置quickSort(arr, low + 1, end);}}}2、插入排序
2.1、概念+舉例
認為所有的數字,都是有序的。將數字依次往前移動,一個一個插入到前面的有序序列中!
從第2個數字開始,把之后的數字挨個遍歷一遍。遍歷的時候,認為前面的數字都是有序的。
在遍歷下一個數字的時候,如果該數字比當前數字更小,則將該數字往前移動,直到前面的數字序列有序;
在遍歷下一個數字的時候,如果該數字比當前數字更大,則將該數字往后移動,直到已經遍歷的數字序列有序。
// 把臨時變量(外層for循環的當前元素)賦給不滿足條件的后一個元素
arr[j + 1] = temp;?
2.2、完整代碼
package demo4;import java.util.Arrays;public class InsertSort {public static void main(String[] args) {int[] arr = new int[] { 5, 3, 2, 8, 5, 9, 1, 0 };insertSort(arr);System.out.println(Arrays.toString(arr));}// 插入排序public static void insertSort(int[] arr) {// 遍歷所有的數字【從第2個數字開始比較!依次往后比。】for (int i = 1; i < arr.length; i++) {if (arr[i] < arr[i - 1]) { // 如果 當前數字arr[i] 比 前一個數字arr[i - 1] 小int temp = arr[i]; // 1、把當前遍歷數字存起來int j;//(內層for循環)遍歷當前數字前面所有的數字【temp < arr[j]:當前遍歷的數字,要大于temp】for (j = i - 1; j >= 0 && temp < arr[j]; j--) {arr[j + 1] = arr[j]; // 數字后移-把前一個數字賦給后一個數字}// 把臨時變量(外層for循環的當前元素)賦給不滿足條件的后一個元素arr[j + 1] = temp;}}}}3、簡單選擇排序
3.1、概念+舉例
簡單選擇排序
標注一個相對較小的數字(x),依次向后找,找一個 比 此數字(x) 還小的數字,遍歷完此數組,將找到的比x小 且 最小的數字,移至最前面。接著從上一個找到的最小的數字,開始往后找,每次只找數組中最小的元素,將其移至前面。一直這樣...
從第1個數字,開始往后找。
從第2個數字,開始往后找。
從第3個數字,開始往后找。
把 所有的數字 遍歷一遍,有多少數字,便選多少次最小的數字。
3.2、完整代碼
package demo4;import java.util.Arrays;public class SelectSort {public static void main(String[] args) {int[] arr = new int[] { 3, 4, 5, 7, 1, 2, 0, 3, 6, 8 };selectSort(arr);System.out.println(Arrays.toString(arr));}// 簡單選擇排序public static void selectSort(int[] arr) {// 遍歷所有的數for (int i = 0; i < arr.length; i++) {int minIndex = i;// 把當前遍歷的數和后面所有的數依次進行比較,并記錄下最小的數的下標for (int j = i + 1; j < arr.length; j++) {// 如果后面比較的數比記錄的最小的數小。if (arr[minIndex] > arr[j]) {// 記錄下最小的那個數的下標minIndex = j;}}// 如果最小的數和當前遍歷數的下標不一致,說明下標為minIndex的數比當前遍歷的數更小。if (i != minIndex) {int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}}}4、3種排序-綜合代碼
4.1、完整代碼
package sort;import java.util.Scanner; import java.util.Arrays;public class Sort {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] arr = new int[] { 5, 7, 2, 9, 4, 1, 0, 5, 7 };System.out.println("排序前的數組: " + Arrays.toString(arr));while (true) {menu();int num = sc.nextInt();switch (num) {case 0:System.out.println("程序已結束!");return;case 1:int[] arr1 = arr;System.out.println("冒泡排序");bubbleSort(arr1);System.out.println(Arrays.toString(arr1));break;case 2:int[] arr2 = arr;System.out.println("快速排序");quickSort(arr2, 0, arr2.length - 1);System.out.println(Arrays.toString(arr2));break;case 3:int[] arr3 = arr;System.out.println("插入排序");insertSort(arr3);System.out.println(Arrays.toString(arr3));break;case 4:int[] arr4 = arr;System.out.println("簡單選擇排序");insertSort(arr4);System.out.println(Arrays.toString(arr4));break;}}}private static void menu() {System.out.println("主菜單");System.out.println("請選擇您需要的排序算法:");System.out.println("1: 冒泡排序");System.out.println("2: 快速排序");System.out.println("3: 插入排序");System.out.println("4: 簡單選擇排序");System.out.println("0: 退出程序!!!");}/*** 1-冒泡排序* * @param arr*/public static void bubbleSort(int[] arr) {// 排序過程 比較次數(compare)、移動次數(move)、記錄第n趟排序結果int comnum = 0, movnum = 0, num = 1;// 控制共比較多少輪for (int i = 0; i < arr.length - 1; i++) {// 控制比較的次數for (int j = 0; j < arr.length - i - 1; j++) { // 減i,比較過的數字,不再進行比較comnum++;if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;movnum++;}}System.out.println("第" + (num++) + "趟 排序結果: ");System.out.println(Arrays.toString(arr));}System.out.println("排序過程-比較次數:" + comnum + "; 移動次數:" + movnum);}/*** 1-冒泡排序優化* * @param arr*/public static void bubbleSort2(int[] arr) {// 控制共比較多少輪for (int i = 0; i < arr.length - 1; i++) {boolean flag = false;// 控制比較的次數for (int j = 0; j < arr.length - 1 - i; j++) { // 減i,比較過的數字,不再進行比較if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;flag = true; // 加入標記}}if (flag) { // 如果沒有交換過元素,則已經有序!return;}}}/*** 2-快速排序(遞歸)* * @param arr* @param start* @param end*/public static void quickSort(int[] arr, int start, int end) {if (start < end) {int stard = arr[start]; // 把數組中的第0個數字做為標準數【從數組的開始位置取標準數】int low = start; // 記錄坐標-記錄需要排序的下標int high = end; // 記錄坐標while (low < high) { // 循環找比標準數大的數和比標準數小的數【高右低左】// 右邊的數字比標準數大// stard <= arr[high]:基準數要小于右邊指針所指的數字while (low < high && stard <= arr[high]) { high--;// 基準數小于右邊指針所指的數字,high--前移}// 使用右邊的數字替換左邊的數arr[low] = arr[high];// 如果左邊的數字比標準數小,則數字不需要移動,low++while (low < high && arr[low] <= stard) {low++;// 下標右移}arr[high] = arr[low];}// low、high重合---把標準數賦給低所在的位置的元素arr[low] = stard;// low、high重合---根據low與high所在的下標-處理所有的小的數字-從開始位置~低的位置quickSort(arr, start, low);// low、high重合---根據low與high所在的下標-處理所有的大的數字-從開始位置~高的位置quickSort(arr, low + 1, end);}}/*** 3-插入排序* * @param arr*/public static void insertSort(int[] arr) {// 遍歷所有的數字【從第2個數字開始比較!依次往后比。】for (int i = 1; i < arr.length; i++) {if (arr[i] < arr[i - 1]) { // 如果 當前數字arr[i] 比 前一個數字arr[i - 1] 小int temp = arr[i]; // 1、把當前遍歷數字存起來int j;// (內層for循環)遍歷當前數字前面所有的數字【temp < arr[j]:當前遍歷的數字,要大于temp】for (j = i - 1; j >= 0 && temp < arr[j]; j--) { arr[j + 1] = arr[j]; // 數字后移-把前一個數字賦給后一個數字}// 把臨時變量(外層for循環的當前元素)賦給不滿足條件的后一個元素arr[j + 1] = temp;}}}/*** 4-簡單選擇排序* * @param arr*/public static void selectSort(int[] arr) {// 遍歷所有的數for (int i = 0; i < arr.length; i++) {int minIndex = i;// 認為當前遍歷的數字是最小的// 把當前遍歷的數和后面所有的數依次進行比較,并記錄下最小的數的下標for (int j = i + 1; j < arr.length; j++) { // j = i + 1 從當前數字的第2個開始遍歷// 如果后面比較的數 比 記錄的最小的數 更小。if (arr[minIndex] > arr[j]) {// 記錄 最小的那個數的下標minIndex = j;}}// 如果最小的數和當前遍歷數的下標不一致,說明下標為minIndex的數比當前遍歷的數更小。if (i != minIndex) {int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}} }4.2、運行截圖
5、其它排序算法匯總
更多排序:https://blog.csdn.net/weixin_44949135/article/details/106784224
堆排序:https://blog.csdn.net/weixin_44949135/article/details/106832176
總結
以上是生活随笔為你收集整理的Java【快速排序、插入排序、简单选择排序...】【八大排序-综合实验】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构Java11【图结构概述、图遍历
- 下一篇: JavaScript基础02【强制类型转