首页 > 代码库 > c - 对数组进行排序(通过指针的指针)

c - 对数组进行排序(通过指针的指针)

  通过指针的指针,以及一个指针数组,对实际数组元素进行排序,有一个优点,就是排序过程交换的只有指针数组中的值,而不是实际的数组的元素.当实际元素中的对象很大,特别是结构体等类型时,这样做是很有好处.

  下面的图表示了排序前和排序后,内存中的变化情况:

 

 

  以下代码是上图的实现:

 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 void27 show(int **p) {28     for (int i = 0; i < SIZE; i++)29         printf("%d ", **(p + i));30     printf("\n");31 }32 33 int34 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 9after sorting:1 4 7 8 9

 

c - 对数组进行排序(通过指针的指针)