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