C語言 指針(5)

目錄

1.冒泡排序

2.二級指針

3.指針數組

4.指針數組模擬二級數組


1.冒泡排序

1.1 基本概念

冒泡排序(Bubble Sort) 是一種簡單的排序算法,它重復地遍歷要排序的數列,一次比較兩個元

素,如果它們的順序錯誤就把它們交換過來。這個算法的名字由來是因為越小(或越大)的元素會

經由交換慢慢“浮”到數列的頂端 。

?如果概念比較抽象的話,我們可以舉個例子理解一下:

假設有5個小朋友排隊,身高從矮到高排才算整齊。老師像冒泡排序程序,每次從隊頭開始,讓相

鄰小朋友比身高,高的往后站。第一輪,最高的小朋友像大泡泡浮到隊尾;第二輪,第二高的小朋

友再浮到倒數第二位置,依此類推,經過4輪,小朋友們就按身高排好隊啦。

1.2 算法原理

冒泡排序的核心思想是通過重復遍歷待排序的數組,比較相鄰元素的大小,若逆序則交換它們的位

置。這樣,每次遍歷都會將未排序序列中最大(或最小)的元素“冒泡”到序列的尾部(或頭部)。

隨著遍歷次數的增加,需要排序的元素逐漸減少,直至完成排序。

1.3 代碼示例

1  //方法1
2  void bubble_sort(int arr[], int sz)//參數接收數組元素個數
3  {
4      int i = 0;
5      for(i=0; i<sz-1; i++)
6      {
7          int j = 0;
8          for(j=0; j<sz-i-1; j++)
9          {
10             if(arr[j] > arr[j+1])
11             {
12                 int tmp = arr[j];
13                 arr[j] = arr[j+1];
14                 arr[j+1] = tmp;
15             }
16          }
17      }
18  }
19
20  int main()
21  {
22      int arr[] = {3,1,7,5,8,9,0,2,4,6};23      int sz = sizeof(arr)/sizeof(arr[0]);
24      bubble_sort(arr, sz);
25      int i = 0;
26      for(i=0; i<sz; i++)
27      {
28          printf("%d ", arr[i]);
29      }
30      return 0;
31  }
32
33
34  //方法2 - 優化
35  void bubble_sort(int arr[], int sz)//參數接收數組元素個數
36  {
37      int i = 0;
38      for(i=0; i<sz-1; i++)
39      {
40          int flag = 1;//假設這一趟已經有序了
41          int j = 0;
42          for(j=0; j<sz-i-1; j++)
43          {
44             if(arr[j] > arr[j+1])
45             {
46                 flag = 0;//發生交換就說明,無序
47                 int tmp = arr[j];
48                 arr[j] = arr[j+1];
49                 arr[j+1] = tmp;
50             }
51          }
52          if(flag == 1)//這一趟沒交換就說明已經有序,后續無序排序了
53              break;
54      }
55  }
56
57  int main()
58  {
59      int arr[] = {3,1,7,5,8,9,0,2,4,6};
60      int sz = sizeof(arr)/sizeof(arr[0]);
61      bubble_sort(arr, sz);
62      int i = 0;
63      for(i=0; i<sz; i++)
64      {
65          printf("%d ", arr[i]);
66      }
67      return 0;
68  }

1.4 代碼原理

方法1

- 函數定義:?bubble_sort?函數接收整型數組?arr?和數組元素個數?sz?,實現冒泡排序。

- 外層循環:?for(i = 0; i < sz - 1; i++)?控制排序輪數,?sz?個元素需?sz - 1?輪 。

- 內層循環:?for(j = 0; j < sz - i - 1; j++)?進行每輪元素比較,每輪把最大元素“冒泡”到末尾。

- 比較交換:?if(arr[j] > arr[j + 1])?判斷相鄰元素大小,若逆序則借助?tmp?交換。

- 主函數:定義數組?arr?,計算元素個數?sz?,調用?bubble_sort?排序,再遍歷打印排序后數組。

?
方法2(優化)

?- 函數定義:同方法1的?bubble_sort?函數功能。

- 外層循環:與方法1類似控制輪數。

- 內層循環:邏輯同方法1,新增?flag?變量。初始設?flag = 1?(假設有序 ,發生交換時?flag= 0?(說明無序 )。

- 提前結束:內層循環后?if(flag == 1)?判斷,若沒交換說明已排好序,?break?提前結束排序。

- 主函數:和方法1主函數類似,定義數組、計算元素個數、調用排序函數并打印結果。

2. 二級指針

指針變量也是變量,是變量就有地址,那指針變量的地址存放在哪里?

這就是 二級指針 。

對于二級指針的運算有:

?*ppa??通過對?ppa?中的地址進行解引用,這樣找到的是 ?pa??,?*ppa??其實訪問的就是 ?pa??

int b = 20;
*ppa = &b; //等價于 pa = &b;

**ppa??先通過 ?*ppa??找到 ?pa?,然后對 ?pa??進行解引用操作:?*pa??,那找到的是 ?a??。
?

**ppa = 30;
//等價于*pa = 30;
//等價于a = 30;

3. 指針數組

指針數組是指針還是數組?

我們類比一下,整型數組,是存放整型的數組,字符數組是存放字符的數組

那指針數組呢?是存放指針的數組。

指針數組的每個元素都是用來存放地址(指針)的。

如下圖:


指針數組的每個元素是地址,又可以指向一塊區域。

4. 數組指針模擬二維數組

#include <stdio.h>
int main()
{int arr1[] = {1,2,3,4,5};int arr2[] = {2,3,4,5,6};int arr3[] = {3,4,5,6,7};//數組名是數組首元素的地址,類型是int*的,就可以存放在parr數組中int* parr[3] = {arr1, arr2, arr3};int i = 0;int j = 0;for(i=0; i<3; i++){for(j=0; j<5; j++){printf("%d ", parr[i][j]);}printf("\n");}return 0;
}

parr[i]是訪問parr數組的元素,parr[i]找到的數組元素指向了整型一維數組,parr[i][j] 就是整型一

維數組中的元素。

上述的代碼模擬出二維數組的效果,實際上并非完全是二維數組,因為每一行并非是連續的。

感謝大家的觀看,本期內容到此結束,希望大家對冒泡排序多多理解!

?

?

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

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

相關文章

15前端項目----用戶信息/導航守衛

登錄/注冊 持久存儲用戶信息問題 退出登錄導航守衛解決問題 持久存儲用戶信息 本地存儲&#xff1a;&#xff08;在actions中請求成功時&#xff09; 添加localStorage.setItem(token,result.data.token);獲取存儲&#xff1a;&#xff08;在user倉庫中&#xff0c;state中tok…

RSS 2025|斯坦福提出「統一視頻行動模型UVA」:實現機器人高精度動作推理

導讀 在機器人領域&#xff0c;讓機器人像人類一樣理解視覺信息并做出精準行動&#xff0c;一直是科研人員努力的方向。今天&#xff0c;我們要探討的統一視頻行動模型&#xff08;Unified Video Action Model&#xff0c;UVA&#xff09;&#xff0c;就像給機器人裝上了一個“…

基于論文的大模型應用:基于SmartETL的arXiv論文數據接入與預處理(四)

上一篇介紹了基于SmartETL框架實現arxiv采集處理的基本流程&#xff0c;通過少量的組件定制開發&#xff0c;配合yaml流程配置&#xff0c;實現了復雜的arxiv采集處理。 由于其業務流程復雜&#xff0c;在實際應用中還存在一些不足需要優化。 5. 基于Kafka的任務解耦設計 5.…

Fiori學習專題三十五:Device Adaptation

由于在類似于手機的小面板上顯示時&#xff0c;我們為了留出更多空間展示數據&#xff0c;可以將一些控件折疊。 1.修改HelloPanel.view.xml&#xff0c;加入expandable“{device>/system/phone}” expanded"{ !${device>/system/phone} <mvc:ViewcontrollerNam…

【記錄】HunyuanVideo 文生視頻工作流

HunyuanVideo 文生視頻工作流指南 概述 本指南詳細介紹如何在ComfyUI中使用騰訊混元HunyuanVideo模型進行文本到視頻生成的全流程操作&#xff0c;包含環境配置、模型安裝和工作流使用說明。 參考&#xff1a;https://comfyui-wiki.com/zh/install/install-comfyui/install-c…

統一返回JsonResult踩坑

定義了一個統一返回類&#xff0c;但是沒有給Data 導致沒有get/set方法&#xff0c;請求一直報錯 public class JsonResult<T> {private int code;private String message;private T data;public JsonResult() {}public JsonResult(int code, String message, T data) {…

dubbo-token驗證

服務提供者過濾器 import java.util.Map; import java.util.Objects;/*** title ProviderTokenFilter* description 服務提供者 token 驗證* author zzw* version 1.0.0* create 2025/5/7 22:17**/ Activate(group CommonConstants.PROVIDER) public class ProviderTokenFilt…

沃倫森電氣高壓動態無功補償裝置助力企業電能優化

在工業生產的復雜電能環境中&#xff0c;電能質量直接影響企業的生產效率和運營成本。XX光伏科技有限公司作為一家快速發展的制造企業&#xff0c;隨著生產規模的不斷擴大&#xff0c;其內部電網面臨功率因數過低、電壓波動頻繁等問題&#xff0c;導致供電部門罰款增加、設備故…

基于EFISH-SCB-RK3576工控機/SAIL-RK3576核心板的網絡安全防火墻技術方案?(國產化替代J1900的全棧技術解析)

?基于EFISH-SCB-RK3576/SAIL-RK3576的網絡安全防火墻技術方案? &#xff08;國產化替代J1900的全棧技術解析&#xff09; ?一、硬件架構設計? ?流量處理核心模塊? ?多核異構架構?&#xff1a; ?四核Cortex-A72&#xff08;2.3GHz&#xff09;?&#xff1a;處理深度…

Maven 動態版本與SNAPSHOT機制詳解

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

趣味編程:答案之書

概述&#xff1a;該篇博客主要介紹的是曾經一度風靡全網的答案之書小程序。 目錄 1. 效果展示 2. 源碼展示 3. 代碼邏輯詳解 3.1 頭文件與全局變量 3.2 main函數 3.3 主循環 3. 4 繪制界面 4. 運行問題 5.小結 1. 效果展示 該小程序是動態的效果&#xff0c; 因此實…

多線程初階(2)

說到多線程編程&#xff0c;一定少不了線程安全這個話題。我們前面了解了線程的原理以及線程與進程的關系。線程之間共享資源&#xff0c;這就代表了在多線程編程中一定會產生沖突&#xff0c;所以我們需要在敲代碼時保證線程安全&#xff0c;避免這樣的問題發生。 我們先看一…

【Ubuntu】安裝向日葵遠程控制

前言 在Ubuntu 24.04.2下安裝向日葵遠程控制出錯&#xff0c;少了一些依賴&#xff0c;需要安裝一些依賴。 1.安裝gconf2-common wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gconf/gconf2-common_3.2.6-6ubuntu1_all.deb sudo dpkg -i gconf2-common_3.2.6-6ub…

【Python開源】深度解析:一款高效音頻封面批量刪除工具的設計與實現

&#x1f3b5; 【Python開源】深度解析&#xff1a;一款高效音頻封面批量刪除工具的設計與實現 &#x1f308; 個人主頁&#xff1a;創客白澤 - CSDN博客 &#x1f525; 系列專欄&#xff1a;&#x1f40d;《Python開源項目實戰》 &#x1f4a1; 熱愛不止于代碼&#xff0c;熱情…

JAVA房屋租售管理系統房屋出租出售平臺房屋銷售房屋租賃房屋交易信息管理源碼

一、源碼描述 這是一套房屋租售管理源碼&#xff0c;基于SpringBootVue框架&#xff0c;后端采用JAVA開發&#xff0c;源碼功能完善&#xff0c;涵蓋了房屋租賃、房屋銷售、房屋交易等業務。 二、源碼截圖

一篇文章講清楚mysql的聚簇索引、非聚簇索引、輔助索引

聚簇索引與非聚簇索引最大的區別就是&#xff1a; 聚簇索引的索引和數據是存放在一起的&#xff0c;都是在葉子結點&#xff1b; 非聚簇索引的索引和數據是分開存儲的&#xff0c;葉子節點存放的是索引和指向數據文件的地址&#xff0c;通過葉子節點找到索引&#xff0c;再通…

使用ESPHome燒錄固件到ESP32-C3并接入HomeAssistant

文章目錄 一、安裝ESPHome二、配置ESP32-C3控制燈1.主配置文件esp32c3-luat.yaml2.基礎通用配置base.yaml3.密碼文件secret.yaml4.圍欄燈four_light.yaml5.彩燈rgb_light.yaml6.左右柱燈left_right_light.yaml 三、安裝固件四、HomeAssistant配置ESPHome1.直接訪問2.配置ESPHom…

什么是變量提升?

變量提升&#xff08;Hoisting&#xff09; 是 JavaScript 引擎在代碼執行前的一個特殊行為&#xff0c;它會將變量聲明和函數聲明自動移動到當前作用域的頂部。但需要注意的是&#xff0c;只有聲明會被提升&#xff0c;賦值操作不會提升。 ??核心概念?? 變量聲明提升&…

【萬字長文】深入淺出 LlamaIndex 和 LangChain:從RAG到智能體,輕松駕馭LLM應用開發

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

2025 后端自學UNIAPP【項目實戰:旅游項目】3、API接口請求封裝,封裝后的簡單測試以及實際使用

一、創建請求封裝目錄 選中自己的項目&#xff0c;右鍵鼠標---->新建---->目錄---->名字自定義【我的是api】 二、創建兩個js封裝文件 選中封裝的目錄&#xff0c;右鍵鼠標---->新建---->js文件---->名字自定義【我的兩個js文件分別是my_http和my_api】 三…