【數據結構 — 排序 — 插入排序】

數據結構 — 排序 — 插入排序

  • 一.排序
    • 1.1.排序的概念及其運用
      • 1.1.1排序的概念
      • 1.1.2排序運用
      • 1.1.3 常見的排序算法
  • 二.插入排序
    • 2.1.直接插入排序
      • 2.1.1.算法講解
      • 2.1.2.代碼實現
        • 2.1.2.1.函數定義
        • 2.1.2.2.算法接口實現
        • 2.1.2.3.測試代碼實現
        • 2.1.2.4.測試展示
    • 2.2.希爾排序
      • 2.2.1.算法講解
      • 2.2.2.代碼實現
        • 2.2.2.1.函數定義
        • 2.2.2.2.算法接口實現
        • 2.2.2.3.測試代碼實現
        • 2.2.2.4.測試展示

一.排序

1.1.排序的概念及其運用

1.1.1排序的概念

排序: 所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。
穩定性: 假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,則稱這種排序算法是穩定的;否則稱為不穩定的。
內部排序: 數據元素全部放在內存中的排序。
外部排序: 數據元素太多不能同時放在內存中,根據排序過程的要求不能在內外存之間移動數據的排序。

1.1.2排序運用

在這里插入圖片描述
在這里插入圖片描述

1.1.3 常見的排序算法

在這里插入圖片描述

二.插入排序

2.1.直接插入排序

2.1.1.算法講解

直接插入排序是一種簡單的插入排序法,其基本思想是:
把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中,直到所有的記錄插入完為止,得到一個新的有序序列 。
實際中我們玩撲克牌時,就用了插入排序的思想
在這里插入圖片描述

當插入第i(i>=1)個元素時,前面的array[0],array[1],…,array[i-1]已經排好序,此時用array[i]的排序碼與array[i-1],array[i-2],…的排序碼順序進行比較,找到插入位置即將array[i]插入,原來位置上的元素順序后移

在這里插入圖片描述

直接插入排序的特性總結:

  1. 元素集合越接近有序,直接插入排序算法的時間效率越高
  2. 時間復雜度:O(N^2)
  3. 空間復雜度:O(1),它是一種穩定的排序算法
  4. 穩定性:穩定

2.1.2.代碼實現

2.1.2.1.函數定義
Sort.h
#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
#include<time.h>//打印
void PrintArray(int* a, int n);
//插入排序
void InsertSort(int* a, int n);
2.1.2.2.算法接口實現
Sort.c
#include"Sort.h"//打印
void PrintArray(int* a, int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");
}
//直接插入排序
void InsertSort(int* a, int n)
{for (int i = 0; i < n-1; i++){int end = i;int tmp = a[end + 1];while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}
2.1.2.3.測試代碼實現
test.c
#include"Sort.h"void TestInsertSort()
{int a[] = { 2,4,5,7,8,0,9,6,3,1 };printf("排序前:");PrintArray(a, sizeof(a) / sizeof(int));printf("\n");printf("直接插入排序:");InsertSort(a, sizeof(a) / sizeof(int));PrintArray(a, sizeof(a) / sizeof(int));
}int main()
{TestInsertSort();return 0;
}
2.1.2.4.測試展示

在這里插入圖片描述

2.2.希爾排序

2.2.1.算法講解

希爾排序法又稱縮小增量法。希爾排序法的基本思想是:先選定一個整數,把待排序文件中所有記錄分成個組,所有距離為的記錄分在同一組內,并對每一組內的記錄進行排序。然后,取,重復上述分組和排序的工作。當到達=1時,所有記錄在統一組內排好序。

在這里插入圖片描述

希爾排序的特性總結:

  1. 希爾排序是對直接插入排序的優化。
  2. 當gap > 1時都是預排序,目的是讓數組更接近于有序。當gap == 1時,數組已經接近有序的了,這樣就會很快。這樣整體而言,可以達到優化的效果。我們實現后可以進行性能測試的對比。
  3. 希爾排序的時間復雜度不好計算,因為gap的取值方法很多,導致很難去計算,因此在好些樹中給出的希爾排序的時間復雜度都不固定:
    數據結構(C語言版)》— 嚴蔚敏
    在這里插入圖片描述
    《數據結構-用面相對象方法與C++描述》— 殷人昆
    在這里插入圖片描述
    在這里插入圖片描述
  4. 穩定性:不穩定

2.2.2.代碼實現

2.2.2.1.函數定義
Sort.h
#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
#include<time.h>//打印
void PrintArray(int* a, int n);
//希爾排序
void ShellSort(int* a, int n);
2.2.2.2.算法接口實現
Sort.c
#include"Sort.h"//打印
void PrintArray(int* a, int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");
}
//希爾排序
void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}
2.2.2.3.測試代碼實現
test.c
#include"Sort.h"void TestShellSort()
{int a[] = { 2,4,5,7,8,0,9,6,3,1 };printf("排序前:");PrintArray(a, sizeof(a) / sizeof(int));printf("\n");printf("希爾排序:");ShellSort(a, sizeof(a) / sizeof(int));PrintArray(a, sizeof(a) / sizeof(int));
}int main()
{TestShellSort();return 0;
}
2.2.2.4.測試展示

在這里插入圖片描述

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

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

相關文章

ASO優化:幫助實現企業和用戶的共贏

大數據時代APP拉獲新客&#xff0c;ASO優化應該這么玩&#xff01; 市場那么大&#xff0c;用戶那么廣。企業設計的APP如何在茫茫人群中精準地把自己送到用戶面前&#xff0c;并與ta產生溝通呢。隨著時代的發展&#xff0c;數據成為企業競爭的核心。APP的營銷發展離不開數據推…

gcc tips - GCC使用技巧與高級特性

目錄 1. 獲取 GCC 編譯器預定義的宏 2. 列出依賴的頭文件 3. 保存預處理結果到文件&#xff08;展開define, 展開include header&#xff09; 4. 寫回調跟蹤記錄函數運行 -finstrument-functions 5. -fdump-rtl-expand 畫函數調用關系圖 GCC&#xff0c;全稱GNU Compiler …

第一課【習題】三方庫

三方組件是開發者在系統能力的基礎上進行了一層具體功能的封裝&#xff0c;對其能力進行拓展的工具 。 可以通過ohpm uninstall 指令下載指定的三方庫 lottie使用loadAnimation方法加載動畫。 通過ohpm安裝lottie后&#xff0c;在哪個文件中會生成相關的配置信息&#xf…

C++ - 哈希

在順序結構以及平衡樹中&#xff0c;由于元素關鍵碼與其存儲位置之間沒有對應的關系&#xff0c;因此在查找一個元素時&#xff0c;必須要經過關鍵碼的多次比較&#xff1b;比如順序表中需要從表頭開始依次往后比對尋找&#xff0c;查找時間復雜度為 O(N)&#xff0c;平衡樹中需…

快速登錄界面關于如何登錄以及多賬號列表解析以及config配置文件如何讀取以及JsLogin模塊與SdoLogin模塊如何通信(4)

1、### Jslogin模塊與前端以及JsLogin模塊與Sdologin的交互 配置文件的讀取: <CompanyIdForQq value"301"/> <CompanyIdForWx value"300"/><CompanyIdForWb value"302"/><qq value"https://graph.qq.com/oauth2.0/au…

freertos統計任務運行時間和堆棧使用情況(快速應用篇)

這里寫自定義目錄標題 背景配置FreeRTOSCconfig.h統計時鐘源任務中打印 背景 本文直接講解如果快速實現freertos打印任務運行時間&#xff0c;堆棧使用情況等調試信息&#xff0c;不講解原理。 配置 FreeRTOSCconfig.h 增加以下代碼&#xff1a; #define configUSE_TRACE_…

git clone 命令

git clone 是一個用于克隆&#xff08;clone&#xff09;遠程 Git 倉庫到本地的命令。 git clone 可以將一個遠程 Git 倉庫拷貝到本地&#xff0c;讓自己能夠查看該項目&#xff0c;或者進行修改。 git clone 命令&#xff0c;你可以復制遠程倉庫的所有代碼和歷史記錄&#xf…

template

類型&#xff1a; string 詳細&#xff1a; 一個字符串模板作為 Vue 實例的標識使用。模板將會替換掛載的元素。掛載元素的內容都將被忽略&#xff0c;除非模板的內容有分發插槽。 如果值以 # 開始&#xff0c;則它將被用作選擇符&#xff0c;并使用匹配元素的 innerHTML 作為…

深入了解 Axios 攔截器

深入了解 Axios 攔截器 本文將向您介紹什么是 Axios 攔截器以及如何使用它們。通過分步指南和示例代碼&#xff0c;您將學習如何使用 Axios 攔截器來處理請求和響應&#xff0c;并添加授權和錯誤處理。 什么是 Axios 攔截器&#xff1f; Axios 攔截器允許您在請求發送和響應…

阿里云SLB的使用總結

一、什么是SLB 實現k8s的服務service的一種推薦方式&#xff0c;也是服務上云后&#xff0c;替代LVS的一個必選產品。 那么它有什么作用呢&#xff1f; 1、負載均衡&#xff0c;是它與生俱來的。可以配置多個服務器組&#xff1a;包括虛擬服務器組、默認服務器組、主備服務器…

markdown快捷鍵

markdown快捷鍵 快捷鍵 Markdown 圖標 快捷鍵 撤銷 Ctrl Z 重做 Ctrl Y 加粗 Ctrl B 斜體 Ctrl I 標題 Ctrl Shift H 有序列表 Ctrl Shift O 無序列表 Ctrl Shift U 待辦列表 Ctrl Shift C 插入代碼 Ctrl Shift K 插入鏈接 Ctrl Shift L 插入圖片 Ctrl Shif…

JUnit 之初體驗

文章目錄 1.定義2.引入1&#xff09;使用 Maven 工具2&#xff09;使用 Gradle 工具3&#xff09;使用 Jar 包 2.樣例0&#xff09;前提1&#xff09;測試類2&#xff09;測試方法3&#xff09;測試斷言4&#xff09;實施 總結 1.定義 JUnit 是一個流行的 Java 單元測試框架&a…

H5ke14--1--拖放

介紹drag,drop 一.被拖動元素,目標(釋放區) 元素要設置dragable屬性:true,false,auto 被拖動元素上面有三個事件,drag,dragend,按下左鍵,移動種,鼠標松,這三個事件一般只用獲取我們的被拖動元素 冒泡:event是可以繼承的,mouseevent鼠標事件,dragevent拖放事件,前面都是一個…

ubuntu 修改系統時間,解決更新軟件報錯問題

ubuntu在更新軟件時出現E: Release file for http://security.ubuntu.com/ubuntu/dists/bionic-security/InRelease 錯誤 網上解決方法一&#xff1a;修改系統時間 修改時區 timedatectl set-timezone Asia/Shanghai 查看當前時間 date -R date -s “2023-12-5 15:57:15” 查看…

C++11多線程基本知識點

文章目錄 進程和線程的概念進程和線程的區別 C多線程的基本內容創建線程std::thread線程IDstd::thread對象生命周期和線程等待和分離線程參數傳遞引用類型成員函數作為線程入口和線程基類的封裝lambda臨時函數作為線程入口函數lambda函數lambda線程 多線程同步和通信多線程通信…

Python基礎(一、安裝環境及入門)

一、安裝 Python 訪問 Python 官方網站 并點擊 "Downloads"&#xff08;下載&#xff09;。 在下載頁面中&#xff0c;你會看到最新的 Python 版本。選擇與你的操作系統相對應的 Windows 安裝程序并下載。 雙擊下載的安裝程序&#xff0c;運行安裝向導。 在安裝向…

$(this) 和 this 關鍵字在 jQuery 中有何不同?

在jQuery中&#xff0c;$(this)是一個特殊的語法&#xff0c;用于使用jQuery庫中的函數和方法來操作當前選擇的元素。這個語法將原生的JavaScript "this" 對象包裝成一個jQuery對象&#xff0c;使開發者可以使用jQuery提供的豐富功能來處理當前元素。 而在一般的Java…

Redis KEY*模糊查詢導致速度慢、阻塞其他 Redis 操作

Redis KEY*模糊查詢導致交互速度慢、阻塞其他 Redis 操作 查詢速度慢的原因 在Redis中&#xff0c;使用通配符 KEYS 命令進行鍵的模糊匹配&#xff08;比如 KEYS key*&#xff09;可能會導致性能問題&#xff0c;尤其是在數據集較大時。這是因為 KEYS 命令的實現需要遍歷所有…

多個大模型高效部署平臺的實戰教程

大家好,我是herosunly。985院校碩士畢業,現擔任算法研究員一職,熱衷于機器學習算法研究與應用。曾獲得阿里云天池比賽第一名,CCF比賽第二名,科大訊飛比賽第三名。擁有多項發明專利。對機器學習和深度學習擁有自己獨到的見解。曾經輔導過若干個非計算機專業的學生進入到算法…

mybatis和mybatisplus中對 同namespace 中id重復處理邏輯源碼解析

一、背景 同事在同一個mapper.xml &#xff08;namespace相同&#xff09;&#xff0c;復制了一個sql沒有修改id&#xff0c;正常啟動項目。但是我以前使用mybatis的時候如果在namespace相同情況下&#xff0c;id重復&#xff0c;項目會報錯無法正常啟動&#xff0c;后來看代碼…