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 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

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

C提高4 多维数组,结构体与二级指针

昨天的试题:原题见昨天作业题 [email protected]:~/high/day03$ cat main.c  /* 二级指针,绝佳训练题1 */ #include <stdio.h> #include <stdlib.h> #include <string.h> int spitspring(char *buf1,char *c,char **myp,int *total) { char *p_head =  buf1; char *p_tail =  buf1

黑马程序员--IOS学习笔记--数组及排序

IOS学习笔记 概述: 8_2.改变整型变量的符号 8_2.改变整型变量所占存储空间 8_3.char类型数据存储 8_4.数组的基本概念及分类 8_5.数组元素作为函数参数 8_5.一维数组定义及注意事项 8_6.一维数组初始化 8_7.一维数组一个让人疑惑的问题 8_8.一维数组的引用 8_9.应用:数组遍历 8_10.一维数组的存储方式 8_11.一维数组的地址 8_12.一维数组长度计算方法 8_13.一维数组的越界问题 8_14.应用:找最大值 8_15.数组元素作为函数参数 8_16

C++——指针---指向数组的指针---指向字符串的指针--指向函数的指针--指针的指针--指针的引用

一.指向数组的指针 代码示例1: 1 int main() 2 { 3 int a[10]={0,2,4,6,8,10,12,14,16,18}; 4 int *p; 5 for(p=&a[0];p<&a[0]+10;p++) 6 printf("%d ",*p); 7 } 代码示例2: int a[10]={0,2,4,6,8,10,12,14,16,18}; int *p; p=a; printf("%d\n",*(a+5));//注意加括

Javascript数组(一)排序

一.简介首先,我们来看一下JS中sort()和reverse()这两个函数的函数吧reverse();这个函数是用来进行倒序,这个没有什么可说的,所谓倒序就是大的在前面,小的在后面. 比如: var array1 = [0,1,5,10,15]; array1.reverse();//结果为:15,10,5,1,0 sort([参数]);这个函数是用来对数组进行正序排列的, var array1 = [0,1,5,10,15]; array1.sort();//结果为:0,1,10,15,5 注

C/C++中数组作为函数形参后退化为指针

最近写了一个函数,把数组作为了它的参数,在这个函数中用到了这个数组的长度,按照正常的求长度的方式,应该不会出错:但是运行之后发现结果却不是我想要的.于是写了一个测试程序来验证我的猜想. #include <iostream> using namespace std; void Sort(int nSortArray[6]) { int nLen = sizeof(nSortArray) / sizeof(nSortArray[0]); int nTmp = 0; for (int i = 0;

给object数组进行排序(排序条件是每个元素对象的属性个数)

从汤姆大叔的博客里看到了6个基础题目:本篇是第3题 - 给object数组进行排序(排序条件是每个元素对象的属性个数) 解题关键: 1.Array.sort的用法 2.object的属性数量的统计 解点1:Array.sort的用法 Array.sort可以为数组指定一个排序规则,一般用如下格式进行指定,代码如下: var arr = [10,6,0,4]; console.log( arr.sort() ); //按字符排序 0,10,4,6 console.log( arr.sort( fu

数组指针和指针数组的区别

数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p+1时,p要跨过n个整型数据的长度. 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组. p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++;       //该语句执行过后,也就是

js中的数组对象排序

一.普通数组排序 js中用方法sort()为数组排序.sort()方法有一个可选参数,是用来确定元素顺序的函数.如果这个参数被省略,那么数组中的元素将按照ASCII字符顺序进行排序.如: var arr = ["a", "b", "A", "B"]; arr.sort(); console.log(arr);//["A", "B", "a", "b"

数组指针、指针数组、函数指针、指针函数 -----笔记

1.数组的四种访问方式 定义数组 a[]; 指针 *p 指向数组a; (1) 利用数组的下表进行访问 a[i]; (2) 数组名+地址的偏移量i *(a+i) (3) 利用指针 p 进行下表访问 p[i] (4) 指针p + 地址的偏移量i *(p+i) 一维数组数组名:相当于一个单指针 2. 数组指针(指针)     指针数组(数组) 函数指针(指针)     指针函数(函数)    -------->只看后边两个字就能够区分是指针还是数组或函数 _______________________