目錄
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] 就是整型一
維數組中的元素。
上述的代碼模擬出二維數組的效果,實際上并非完全是二維數組,因為每一行并非是連續的。
感謝大家的觀看,本期內容到此結束,希望大家對冒泡排序多多理解!
?
?