簡述八大排序(Sort)

1.插入排序

1.1直接插入排序

給定一組數據,若數據只有一個肯定是有序的,我們將無序數據一個個插入到已有序的數據中。用i遍歷無序數據,j遍歷有序數據,找到合適插入位置,用tmp存放目標插入數據,將其與j對應數據對比,若大于j就放在j后面,小于j就把j數據往前移一位,j–再次判斷。具體代碼如下:

 public static void insertSort(int [] array){for(int i=1;i<array.length;i++){int tmp=array[i];//無序數據int j=i-1;for(;j>=0;j--){if(array[j]>tmp){array[j+1]=array[j];}else{array[j+1]=tmp;break;}}array[j+1]=tmp;}}

1.2希爾排序

希爾排序可以說時直插排序的plus版本,因為直接插入排序的特性是數據越有序排序越快,所以希爾排序會先把數據分成gap組,gap不固定,將每組中的數據進行排序,gap不斷減小,最終當gap等于1時排序完畢。具體代碼如下:

 public static void shellSort(int [] array){int gap=array.length;while(gap>1){gap=gap/2;shell111(array,gap);}}private static void shell(int [] array ,int gap){for(int i=gap;i<array.length;i++){int tmp=array[i];int j=i-gap;for(;j>=0;j=j-gap){if(array[j]>tmp){array[j+gap]=array[j];}else {array[j+gap]=tmp;break;}}array[j+gap]=tmp;}}

2.選擇排序

2.1直接選擇排序

思想:j從第一個開始遍歷,每次遍歷找到當前最小的值的下標,存入minIndex,然后跟下標為i的交換,隨后i++,直到整個數據遍歷完畢。具體代碼實現:

  public static void selectSort(int [] array){for(int i=0;i<array.length;i++){int minIndex=i;for(int j=i+1;j<array.length;j++){if(array[j]<array[minIndex]){minIndex=j;//更新最小下標值}}swap(array,minIndex,i);}}

2.2堆排序

思想:先把一組數據建成堆(升序就大根堆,降序就小根堆),然后將堆首元素與堆尾元素交換,因為堆首元素一定是max/min值,具體代碼如下:

 public static void heapSort(int[] array){createHeap111(array);int end=array.length-1;while(end>0){swap(array,end,0);siftDown111(array,0,end-1);end--;}}private static void createHeap(int [] array){int parent=(array.length-2)/2;for(;parent>=0;parent--){siftDown111(array,parent,array.length-1);}}private static void siftDown(int[] array, int parent,int end) {int child=parent*2+1;while(child<=end){if(child+1<=end&&array[child]<array[child+1]){child++;}if(array[child]>array[parent]){swap(array,parent,child);parent=child;child=2*parent+1;}else{break;}}}

3.交換排序

3.1冒泡排序

比較i趟,每一趟都將找出當前范圍的最小值/最大值,讓它排到末尾,也就是每一趟都定義一個j,j從0開始遍歷,如果j大于j+1就叫喚,然后j++,直到循環結束,這樣一趟下來就能將一個最值交換到末尾。具體代碼實現:

  public static void bubbleSort(int [] array){for(int i=0;i<array.length-1;i++){for(int j=0;j<array.length-1-i;j++){if(array[j]>array[j+1]){swap(array,j,j+1);}}}}

3.2快速排序(挖坑法)

思路;首先找出一個基準值tmp,通常由left對應值擔任,當left值賦給tmp后,left就可以看作一個坑,此時right往前走,直到找到比tmp小的值將這個值“填”到left坑中,此時right也成了一個坑,left開始走,直到找到比tmp大的值將其“填”到right,就這樣直到left和right相遇,這時將tmp“填”到相遇這個坑中。具體代碼如下:

public static void rapidSort(int [] array){rapid111(array,0,array.length-1);
}
private static void rapid(int [] array,int left,int right){if(left>=right){return;}int mid=getMid111(array,left,right);rapid111(array,0,mid-1);rapid111(array,mid+1,right);
}
private static int  getMid(int [] array,int left,int right){int tmp=array[left];while(left<right){while(left<right&&array[right]>tmp){right--;}array[left]=array[right];while(left<right&&array[left]<tmp){left++;}array[right]=array[left];}array[left]=tmp;return left;
}

4.歸并排序

思想:將一大組數據分解成小組數據,然后將小組數據有序,然后將小組數據合并為大組數據。
所以整個過程就分為:分割——合并
先說分割:結束條件——left==right。若不滿足,則計算mid,通過mid將該范圍分割為兩部分,具體代碼如下:

private static void mergeNum(int [] array,int left,int right){
if(left==right){
return ;}
int mid=(left+right)/2;
mergeNum(array,left,mid);
mergeNum(array,mid+1,right);
}

再說合并:假設有兩組數據,設計變量s1 e1,s2 e2表示兩組數據的頭和尾,然后創建一個數組,按從小到大將兩組數據放在數組中,然后將這個數組元素復制到array數組中對應的位置。具體代碼如下:

 private static void merge(int [] array,int left,int mid,int right){int [] num=new int[right-left+1];int k=0;int s1=left;int e1=mid;int s2=mid+1;int e2=right;while(s1<=e1&&s2<=e2){if(array[s1]<=array[s2]){num[k++]=array[s1++];}else{num[k++]=array[s2++];}}//必有一敗  將剩余組數據放在數組while(s2<=e2){num[k++]=array[s2++];}while(s1<=e1){num[k++]=array[s1++];}//數組元素有序,還給arrayfor(int i=0;i<num.length;i++){array[i+left]=num[i];}}

5.計數排序

具體代碼如下:

 public static void countSort(int [] array){int left=0;int right=array.length-1;int maxVal=array[0];int minVal=array[0];for(int i=1;i<array.length;i++){if(array[i]>maxVal){maxVal=array[i];}if(array[i]<minVal){minVal=array[i];}}int [] number=new int[maxVal-minVal+1];//初始化計數數組for(int i=0;i<array.length;i++){int index=array[i];number[index-minVal]++;}//將計數數組元素打印到原數組中int index=0;for(int i=0;i<number.length;i++){while(number[i]!=0){array[index]=i+ minVal;index++;number[i]--;}}}

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

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

相關文章

xcode 編譯運行錯誤 Sandbox: rsync(29343) deny(1) file-write-create

解決方法 方法一&#xff1a;修改Targets -> Build Settings 中 ENABLE_USER_SCRIPT_SANDBOXING 設置 NO 方法二&#xff1a;項目使用cocoaPods進行三方管理 且 使用了 use_frameworks&#xff0c;把 use_frameworks 注釋掉,然后重新自行pod install

linux系統中防火墻的操作

防火墻 開放ssh端口 sudo ufw allow 22/tcp # 允許 SSH 連接 sudo ufw enable開放防火墻端口 sudo ufw allow 80/tcp # HTTP sudo ufw allow 443/tcp # HTTPS&#xff08;如果需要&#xff09; sudo ufw enable查看擋墻防火墻設置 sudo ufw status刪除其中一條防火墻規…

[特殊字符] 超強 Web React版 PDF 閱讀器!支持分頁、縮放、旋轉、全屏、懶加載、縮略圖!

在現代 Web 項目中&#xff0c;PDF 瀏覽是一個常見需求&#xff1a;從政務公文到合同協議&#xff0c;PDF 文件無處不在。但很多方案要么體驗不佳&#xff0c;要么集成復雜。今天&#xff0c;我給大家帶來一個開箱即用、功能全面的 PDF 預覽組件 —— [PDFView](https://www.np…

設計模式——策略設計模式(行為型)

摘要 策略設計模式是一種行為型設計模式&#xff0c;它定義了一系列算法并將每個算法封裝起來&#xff0c;使它們可以相互替換。該模式讓算法的變化獨立于使用算法的客戶&#xff0c;從而使得算法可以靈活地切換和擴展。其主要角色包括策略接口、具體策略類和環境類。策略模式…

DeepSeek-R1-0528,官方的端午節特別獻禮

DeepSeek&#xff1a;端午安康&#xff01;刻在國人骨子里的浪漫 2025 年 05 月 28 日 | DeepSeek 端午特別獻禮 當粽葉飄香時&#xff0c;DeepSeek 悄然帶來一份節日驚喜 版本號 DeepSeek-R1-0528 正式上線 官方賦予它的靈魂是&#xff1a; 思考更深 推理更強 用戶通過官網…

mac安裝brew時macos無法信任ruby的解決方法

背景 在使用如下腳本安裝brew時&#xff0c;遇到安裝ruby&#xff0c;macos不信任外部軟件&#xff0c;在安全性點擊信任仍然無法安裝。 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"如何解決 本地安裝好符…

2025音頻傳輸模塊全球選購指南:高品質音頻體驗的品牌之選

隨著無線技術的迅猛發展&#xff0c;音頻傳輸模塊&#xff08;Audio Transmission Module&#xff09;已成為高品質音頻體驗的關鍵技術之一。它們廣泛應用于智能家居、無線耳機、會議系統、廣播設備以及專業音頻領域。面對市場上多樣化的產品&#xff0c;如何選擇適合自己需求的…

解析樓宇自控系統:分布式結構的核心特點與優勢展現

在建筑智能化發展的進程中&#xff0c;樓宇自控系統作為實現建筑高效運行與管理的關鍵&#xff0c;其系統結構的選擇至關重要。傳統的集中式樓宇自控系統在面對日益復雜的建筑環境和多樣化的管理需求時&#xff0c;逐漸暴露出諸多弊端&#xff0c;如可靠性低、擴展性差、響應速…

Spring Boot對一些技術框架進行了統一版本號管理

這個說法是 正確的。 Spring Boot 對許多常用依賴進行了版本管理&#xff0c;因此在項目中引入這些依賴時&#xff0c;通常不需要指定版本號。 Spring Boot 依賴版本管理 &#x1f6e0;? spring-boot-starter-parent&#xff1a;當你的項目在 pom.xml (Maven 項目) 中繼承自…

關于MySQL的索引

一、索引 1、索引概述 1.1、介紹 索引&#xff08; index &#xff09;是幫助 MySQL 高效獲取數據的數據結構 ( 有序 ) 。在數據之外&#xff0c;數據庫系統還維護著滿足特定查找算法的數據結構&#xff0c;這些數據結構以某種方式引用&#xff08;指向&#xff09;數據&…

微服務常用日志追蹤方案:Sleuth + Zipkin + ELK

在微服務架構中&#xff0c;一個用戶請求往往需要經過多個服務的協同處理。為了有效追蹤請求的完整調用鏈路&#xff0c;需要一套完整的日志追蹤方案。Sleuth Zipkin ELK 組合提供了完整的解決方案 Sleuth&#xff1a;生成和傳播追蹤IDZipkin&#xff1a;收集、存儲和可視化…

R語言基礎| 創建數據集

在R語言中&#xff0c;有多種數據類型&#xff0c;用以存儲和處理數據。每種數據類型都有其特定的用途和操作函數&#xff0c;使得R語言在處理各種數據分析任務時非常靈活和強大&#xff1a; 向量&#xff08;Vector&#xff09;: 向量是R語言中最基本的數據類型&#xff0c;它…

nssctf第二題[SWPUCTF 2021 新生賽]簡簡單單的邏輯

這是題目&#xff0c;下載后得到一個python文件,打開 解讀代碼&#xff1a; for i in range(len(list)):key (list[i]>>4)((list[i] & 0xf)<<4)result str(hex(ord(flag[i])^key))[2:].zfill(2)list[i]>>4&#xff1a;從列表中取數字同時高4位向右位…

mysql(十五)

目錄 子查詢 1.準備工作 2--創建表格 3--插入數據 2.where 子查詢單列單個數據 格式 查詢 3.where 子查詢單列多個數據(in) 格式 查詢 使用子查詢 4.from 多行多數據 格式 查詢 子查詢 將select的查詢的返回結果 當成另外一個selet語句的內容去使用。 子查詢放在()里面 注意…

【HarmonyOS 5】鴻蒙Taro跨端框架

?Taro跨端框架? 支持React語法開發鴻蒙應用&#xff0c;架構分為三層&#xff1a; ArkVM層運行業務代碼和React核心TaroElement樹處理節點創建和屬性綁定TaroRenderNode虛擬節點樹與上屏節點一一對應 import { Component } from tarojs/taro export default class MyCompon…

華為OD機試真題——會議接待 /代表團坐車(2025A卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式! 本文收錄于專欄:《2025華為OD真題目錄+全流程解析/備考攻略/經驗分享》 華為OD機試真題《會議…

C語言---動態內存管理、柔性數組

一、malloc和free 1、變長數組 變長數組是指數組的大小可以通過變量來指定。 在c99以及之后的標準中&#xff1a; #include<stdio.h> int main() { int n0; scanf("%d",&n); } 2、malloc和free 這個函數向內存申請一塊連續可用的空間&#xff0c;并返…

WEBSTORM前端 —— 第3章:移動 Web —— 第4節:移動適配-VM

目錄 一、適配方案 二、VM布局 ?編輯 三、vh布局 四、案例—酷我音樂 一、適配方案 二、VM布局 三、vh布局 四、案例—酷我音樂

Dynamics 365 Business Central AI Sales Order Agent Copilot

#AI Copilot# #D365 BC 26 Wave# 最近很多客戶都陸續升級到 Dynamics 365 Business Central 26 wave, Microsoft 提供一個基于Copilot 的Sales Order Agent&#xff0c;此文將此功能做個介紹. Explorer: 可以看到26版本上面增加了這樣一個新圖標。 Configuration: 配置過程…

【harbor】--配置https

使用自建的 CA 證書來自簽署和啟用 HTTPS 通信。 &#xff08;1&#xff09;生成 CA認證 使用 OpenSSL 生成一個 2048位的私鑰這是 自建 CA&#xff08;證書頒發機構&#xff09; 的私鑰&#xff0c;后續會用它來簽發證書。 # 1創建CA認證 cd 到harbor [rootlocalhost harbo…