通过指针的指针,以及一个指针数组,对实际数组元素进行排序,有一个优点,就是排序过程交换的只有指针数组中的值,而不是实际的数组的元素.当实际元素中的对象很大,特别是结构体等类型时,这样做是很有好处.
下面的图表示了排序前和排序后,内存中的变化情况:
以下代码是上图的实现:
1 #include <stdio.h> 2 3 #define SIZE 5 4 5 //这里用冒泡排序. 6 void 7 bubbleSort(int **pArr) { 8 int *tmp; 9 int isSwap; //标识排序过程是否进行交换操作(0为没有交换,1为交换). 10 for(int i = 0; i < SIZE - 1; i++) { 11 isSwap = 0; 12 for(int j = 0; j < SIZE - 1 - i; j++) { 13 if(**(pArr + j) > **(pArr + j + 1)) { 14 tmp = *(pArr + j); 15 *(pArr + j) = *(pArr + j + 1); 16 *(pArr + j + 1) = tmp; 17 18 isSwap = 1; //标识进行交换操作. 19 } 20 } //for(j). 21 if(!isSwap) break; //表示排好序. 22 } 23 } 24 25 //打印数组实际元素. 26 void 27 show(int **p) { 28 for (int i = 0; i < SIZE; i++) 29 printf("%d ", **(p + i)); 30 printf("\n"); 31 } 32 33 int 34 main(void) { 35 int a[] = {7,4,8,1,9}; //实际数组. 36 int *pArr[SIZE] ; //指针数组,每个元素与实际数组中一一对应. 37 int **p = pArr; //指向指针数组的首地址的指针. 38 39 for (int i = 0; i < SIZE; i++) 40 pArr[i] = &a[i]; //对指针数组的元素逐一赋值. 41 42 printf("before sorting:\n"); 43 show(p); 44 bubbleSort(p); 45 printf("after sorting:\n"); 46 show(p); 47 }
output:
before sorting: 7 4 8 1 9 after sorting: 1 4 7 8 9
时间: 2024-10-06 02:38:20