插入、希爾、歸并、快速排序(java實現)

目錄

插入排序

希爾排序

歸并排序

快速排序


插入排序

排序原理:

1.把所有元素分為兩組,第一組是有序已經排好的,第二組是亂序未排序。

2.將未排序一組的第一個元素作為插入元素,倒序與有序組比較。

3.在有序組中找到比插入元素小或者大的元素,將插入元素放入該位置,后面元素向后移動一位。

?時間復雜度:O(n^2)

穩定性:當A與B相等,排序前A若在B前,排序后A仍然在B前,就說明該排序是穩定的。

插入排序:穩定

//比較兩元素大小方法private static boolean greater(Comparable v,Comparable w){return v.compareTo(w)>0;}
 //數組中 交換元素位置private static void exch(Comparable[] a,int i,int j){Comparable temp;temp = a[i];a[i] = a[j];a[j] = temp;}

插入排序

    public static void insertSort(Comparable[] a){for (int i = 1; i < a.length-1; i++) {for (int j = i+1; j >0; j--) {if (greater(a[j-1],a[j])){exch(a,j-1,j);}else break;}}}

希爾排序

排序原理:

1.選擇一個增長量h,按照h將數據分組。

2.每組進行插入排序。

3.減少增長量h直到h=1,重復步驟2

穩定性:不穩定

     public static void shellSort(Comparable[] a){int h = 1;//確定hwhile (h<a.length/2){h = 2*h+1;}// 希爾排序while (h>=1){for (int i = h; i < a.length; i=i+h) {for (int j = i; j >= h; j=j-h) {if (greater(a[j-h],a[j])){exch(a,j-h,j);}else break;}}h=h/2;}}

歸并排序

排序原理:

1.盡可能的一組數據拆分成兩個元素相等的子組,并對每一個子組繼續拆分,直到拆分后的每個子

組的元素個數是1為止。

2.將相鄰的兩個子組進行合并成一個有序的大組;

3.不斷的重復步驟2,直到最終只有一個組為止。

時間復雜度:O(nlogn)

穩定性: 穩定

import java.util.Arrays;public class Merge {//歸并需要的輔助數組private static Comparable[] assist;//判斷v是否比w小private static boolean less(Comparable v,Comparable w){return v.compareTo(w)<0;}//交換元素private static void exch(Comparable[] a,int i,int j){Comparable t = a[i];a[i] = a[j];a[j] = t;}//對數組a排序public static void sort(Comparable[] a){//    1.初始化輔助數組assistassist= new Comparable[a.length];//    定義lo變量和hi變量。分別記錄數組中最小的索引和最大的索引int lo = 0;int hi = a.length-1;sort(a,lo,hi);}//對數組a中從lo到hi元素進行排序private static void sort(Comparable[] a,int lo,int hi){//安全檢驗if (hi<=lo){return;}//  對lo和hi之間的數據進行分為兩組int mid = lo+(hi-lo)/2;//    分別排序sort(a,lo,mid);sort(a,mid+1,hi);//兩組歸并merge(a,lo,mid,hi);}//歸并private static void merge(Comparable[] a,int lo,int mid,int hi){//    定義三個指針int i = lo;int p1 = lo;int p2 = mid+1;//    遍歷移動p1指針和p2指針,比較對應 索引處的值,找出小的,放到輔助數組對應分索引處while (p1<=mid&&p2<=hi){if (less(a[p1],a[p2])){assist[i++] = a[p1++];}else {assist[i++] = a[p2++];}}//遍歷,如果p1的指針沒有走完,將p1剩余遍歷到輔助數組中while (p1<=mid){assist[i++] = a[p1++];}//遍歷,如果p2的指針沒有走完,將p2剩余遍歷到輔助數組中while (p2<=hi){assist[i++] = a[p2++];}//    把輔助數組中的元素復制到原數組中for (int index = lo;index<=hi;index++){a[index] = assist[index];}}public static void main(String[] args) {Integer[] a={7,8,4,5,6,1,3,9,2};Merge.sort(a);System.out.println(Arrays.toString(a));//    [1, 2, 3, 4, 5, 6, 7, 8, 9]}}

快速排序

排序原理:
1.首先設定一個分界值,通過該分界值將數組分成左右兩部分;

2.將大于或等于分界值的數據放到到數組右邊,小于分界值的數據放到數組的左邊。此時左邊部分

中各元素都小于或等于分界值,而右邊部分中各元素都大于或等于分界值;

3.然后,左邊和右邊的數據可以獨立排序。對于左側的數組數據,又可以取一個分界值,將該部分

數據分成左右兩部分,同樣在左邊放置較小值,右邊放置較大值。右側的數組數據也可以做類似處

理。
4.重復上述過程,可以看出,這是一個遞歸定義。通過遞歸將左側部分排好序后,再遞歸排好右側

部分的順序。當左側和右側兩個部分的數據排完序后,整個數組的排序也就完成了。?

時間復雜度:

平均情況:O(nlogn),最壞情況:O(n^2)?

穩定性:不穩定?

import java.util.Arrays;public class Quick {private static void exch(Comparable[] a,int i,int j){Comparable t = a[i];a[i] = a[j];a[j] = t;}private static boolean less(Comparable v,Comparable w){return v.compareTo(w)<0;}//對數組內的元素進行排序public static void sort(Comparable[] a){int lo = 0;int hi = a.length-1;sort(a,lo,hi);}//對數組a中從索引hi之間的元素進行排序public static void sort(Comparable[] a,int lo,int hi){if (lo>=hi)return;int partition = partition(a,lo,hi);sort(a,lo,partition-1);sort(a,partition+1,hi);}private static int partition(Comparable[] a,int lo,int hi){//確定分界值Comparable key = a[lo];//定義兩個指針,分別指向待切分元素的最小索引處和最大索引處的下一個位置int left = lo;int right = hi+1;//切分 掃描while (true){//先從右邊向左掃描,移動right指針,找到比分界值小的,停止while (less(key,a[--right])){if (right==lo){break;}}//從左邊向右掃描,移動light指針,找到比分界值大的,停止while (less(a[++left],key)){if (left==hi){break;}}//right<right時交換if (left>=right){break;}else {exch(a,left,right);}}//交換分界值exch(a,lo,right);return right;}public static void main(String[] args) {Integer a[] = {3,6,9,2,5,8,4,7,1};Quick.sort(a);System.out.println(Arrays.toString(a));//    [1, 2, 3, 4, 5, 6, 7, 8, 9]}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39167.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39167.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39167.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 內核內存管理 page_address 函數

文章目錄 一、page_address1.1 page_address1.2 page_to_pfn1.3 PFN_PHYS1.4 __va(x)1.5 總結1.6 page_to_virt 二、使用demo 一、page_address 1.1 page_address 內核用 struct page 結構體來表示系統中的每個物理頁面&#xff0c;該結構體用來跟蹤和管理這些物理頁面的使用…

MySQL面試題一

MySQL 索引使用有哪些注意事項呢&#xff1f; 可以從兩個維度回答這個問題&#xff1a; 索引哪些情況會失效&#xff0c;索引不適合哪些場景 索引哪些情況會失效 查詢條件包含or&#xff0c;會導致索引失效。隱式類型轉換&#xff0c;會導致索引失效&#xff0c; 例如age字…

Idea的基本使用帶案例---詳細易懂

一.idea是什么 有專業人士說&#xff0c;idea是天生適合做微軟&#xff0c;當時我還想肯定是夸大其詞了&#xff0c;但當你用起來的時候確實很爽&#xff0c;&#x1f60a;&#x1f60a; ntelliJ IDEA是一種集成開發環境&#xff08;IDE&#xff09;&#xff0c;由JetBrains開發…

后仿知識總結

基本詞語的概念&#xff1a; &#xff08;1&#xff09;Place&Routing pr&#xff0c;布局布線 sdf基礎概念&#xff1a; 靜態時序分析圣經翻譯計劃——附錄B&#xff1a;SDF&#xff08;上&#xff09; - 知乎 (zhihu.com) 靜態時序分析圣經翻譯計劃——附錄B&#x…

繼承和多態C++

這里寫目錄標題 繼承public、protected、private 修飾類的成員public、protected、private 指定繼承方式改變訪問權限 C繼承時的名字遮蔽問題基類成員函數和派生類成員函數不構成重載C基類和派生類的構造函數構造函數的調用順序基類構造函數調用規則 C基類和派生類的析構函數C多…

MTK Android隱藏NavigationBar

安卓MTK屏蔽NavigationBar, 在SDK中通過搜索關鍵字修改&#xff0c;可適用大部分MTK及安卓版本&#xff0e; 方法介紹 搜索device/mediatek與device/mediateksample下的.xml把config_showNavigationBar值置為false 如下為搜索指令 find device/mediatek -name “*.xml” | xa…

系統架構師---開發方法---敏捷開發

目錄 前言 極限編程 四大價值觀 溝通 簡單 反饋 勇氣 尊重&#xff1a; 十二個最佳實踐 計劃游戲 小型發布 隱喻 簡單設計 測試先行 重構 結對編程 集體代碼所所有制 持續集成 每周工作40小時 現場客戶 編碼標準 前言 2001年2月&#xff0c;在美國的猶他州…

Grafana展示k8s中pod的jvm監控面板/actuator/prometheus

場景 為保障java服務正常運行&#xff0c;對服務的jvm進行監控&#xff0c;通過使用actuator組件監控jvm情況&#xff0c;使用prometheus對數據進行采集&#xff0c;并在Grafana展現。 基于k8s場景 prometheus數據收集 配置service的lable&#xff0c;便于prometheus使用labl…

LVS負載均衡集群

目錄 集群 什么是集群 (含義) 集群的分類 LVS 負載均衡器的集群架構 負載均衡器的群集工作模式 LVS負載均衡器的調度算法 LVS組成作用 組成 作用 LVS群集創建與管理 創建步驟 ipvsadm工具 LVS-NAT部署實戰 1、部署共享存儲 2、配置節點服務器&#xff08;后端服…

JetPack Compose 學習筆記(持續整理中...)

1.為什么要學&#xff1f; 1.命令式和聲明式 UI大戰,個人認為命令式UI自定義程度較高,能更深入到性能,內存優化方面,而申明式UI 是現在主流的設計,比如React,React Native,Flutter,Swift UI等等,現在性能也逐漸在變得更好 2.還有一個原因compose 是KMM 是完整跨平臺的UI基礎 3.…

kafka使用心得(一)

kafka入門 一種分布式的、基于發布/訂閱的消息系統&#xff0c;scala編寫&#xff0c;具備快速、可擴展、可持久化的特點。 基本概念 topic 主題 partition 分區&#xff0c;一個topic下可以有多個partition&#xff0c;消息是分散到多個partition里存儲的&#xff0c;part…

劍指Offer48.最長不含重復字符的子字符串 C++

1、題目描述 請從字符串中找出一個最長的不包含重復字符的子字符串&#xff0c;計算該最長子字符串的長度。 示例 1: 輸入: “abcabcbb” 輸出: 3 解釋: 因為無重復字符的最長子串是 “abc”&#xff0c;所以其長度為 3。 示例 2: 輸入: “bbbbb” 輸出: 1 解釋: 因為無重復字…

圖像處理技巧形態學濾波之膨脹操作

1. 引言 歡迎回來&#xff0c;我的圖像處理愛好者們&#xff01;今天&#xff0c;讓我們繼續研究圖像處理領域中的形態學計算。在本篇中&#xff0c;我們將重點介紹腐蝕操作的反向效果膨脹操作。 閑話少說&#xff0c;我們直接開始吧&#xff01; 2. 膨脹操作原理 膨脹操作…

macOS CLion 使用 bits/stdc++.h

macOS 下 CLion 使用 bits/stdc.h 頭文件 terminal運行 brew install gccCLion里配置 -D CMAKE_CXX_COMPILER/usr/local/bin/g-11

Visual Studio 2022 中解決使用scanf報錯的方法(一勞永逸)

目錄 【前言】 一、scanf報錯示例 二、解決使用scanf報錯的方法 解決方法1&#xff08;不推薦&#xff09; 解決方法2&#xff08;不推薦&#xff09; 解決方法3&#xff08;強烈推薦&#xff09; 第一步 第二步 第三步 三、效果演示&#xff08;方法三&#xff09; …

根據一棵樹的兩種遍歷構造二叉樹

題目 給定兩個整數數組 preorder 和 inorder &#xff0c;其中 preorder 是二叉樹的先序遍歷&#xff0c; inorder 是同一棵樹的中序遍歷&#xff0c;請構造二叉樹并返回其根節點。 示例 1: 輸入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 輸出: [3,9,20,null,null,…

Unity-Linux部署WebGL項目MIME類型添加

在以往的文章中有提到過使用IIS部署WebGL添加MIME類型使WebGL項目在瀏覽器中能夠正常加載&#xff0c;那么如果咱們做的是商業項目&#xff0c;往往是需要部署在學校或者云服務器上面的&#xff0c;大部分情況下如果項目有接口或者后臺管理系統&#xff0c;后臺基本都會使用Lin…

機器學習筆記:李宏毅ChatGPT Finetune VS Prompt

1 兩種大語言模型&#xff1a;GPT VS BERT 2 對于大語言模型的兩種不同期待 2.1 “專才” 2.1.1 成為專才的好處 Is ChatGPT A Good Translator? A Preliminary Study 2023 Arxiv 箭頭方向指的是從哪個方向往哪個方向翻譯 表格里面的數值越大表示翻譯的越好 可以發現專門做翻…

Ceph入門到精通-Linux下Ceph源碼編譯和GDB調試

Ceph版本&#xff1a;14.2.22 Linux版本&#xff1a;ubuntu-server 18.04 第一部分 下載Ceph源碼 1.1 配置Ceph源碼鏡像源 Ceph源碼是托管在Github上&#xff0c;由于某些原因&#xff0c;國內訪問Github網站很慢&#xff0c;所以需要從其他途徑加速獲取源碼。Github官方給出…

【ubuntu18.04】01-network-manager-all.yaml和interfaces和resolv.conf各有什么區別和聯系

文章目錄 01-network-manager-all.yaml、interfaces 和 resolv.conf 是與網絡配置相關的文件&#xff0c;它們在網絡設置中有著不同的作用和使用方式。 01-network-manager-all.yaml: 這是一個配置文件&#xff0c;通常在 Ubuntu 系統上使用 NetworkManager 進行網絡管理時使用…