一维整型数组的指针操作①

目录

数组元素打印

元素交换

求max

选择排序

冒泡排序

插入排序


数组元素打印

void printArray(int *begin,int *end)
{
    while(begin<=end)
    {
        printf("%d ",*begin++);
    }
    putchar('\n');
}
  • void printArray(int *begin, int *end):该函数是一个无返回值的函数,它接收两个参数,分别是指向数组起始位置的指针 begin 和指向数组结束位置的指针 end

while(begin<=end)这个循环会遍历从begin指向的位置到end指针指向的位置(包括end指针指向的位置)

*begin++先取begin指针指向的值,再将begin指针递增

元素交换

void swap(int *a,int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}
  • void swap(int *a, int *b):该函数是一个无返回值的函数,它接收两个参数,分别是指向整数类型变量的指针 ab

int t = *a;声明了一个整型变量t,并将指针*a 所指向的值赋给t。t保存*a的值

*a = *b;将指针b所指向的值赋给指针a所指向的位置,此时a所指的变量被赋予了b所指向的值

*b = t; t的值赋给指针b所指向的位置,此时b所指向的变量被赋予最初a所指向的值

指针操作变量的值——指针可以访问和修改变量所指内存地址中的值

求max

void maxArray(int *a,int len)
{
    int max = *(a+0);
    int i = 0;
    for(i = 1;i<len;i++)
    {
        if(max<*(a+i))
            max = *(a+i);
    }
    printf("max = %d\n",max);
}
  • void maxArray(int *a, int len):该函数是一个无返回值的函数,它接收两个参数,一个是指向整型数组的指针 a,另一个是数组的长度 len

int max = *(a+0);   *(a+0)等价于a[0],*a

选择排序

void choiceSort(int *begin,int *end)
{
    int *p = begin;
    int *q = NULL;

    for(p=begin;p<end;p++)
    {
        for(q=p+1;q<=end;q++)
        {
            if(*p>*q)
            {
                swap(p,q);    
            }
        }

    }
}
  • void choieSort(int *begin, int *end):该函数是一个无返回值的函数,它接收两个参数,分别是指向数组起始位置的指针 begin 和指向数组结束位置的指针 end

if(*p>*q)是选择排序算法的关键比较步骤

这里以升序为例——选择排序的工作原理是反复地找到未排序部分中的最小值,并将其与未排序部分的第一个元素交换,直到整个数组有序(找到当前位置的最小值,并将其放到适当的位置)

外层循环:指针p遍历数组的每一个元素。在每次迭代中,指针指向的是当前未排序部分的第一个元素

内层循环:指针q遍历p之后的每一个元素,用于找到未排序部分的最小值

if(*p>*q)的作用是比较当前元素*p和剩余未排序部分的元素*q

如果*p>*q说明p指向的元素大于q指向的元素,需要交换位置

冒泡排序

void bubbleSort(int * begin,int *end)
{
    int *p = begin;
    int *q = NULL;
    for(p=end;p>begin;p--)
    {
        for(q = begin;q<p;q++)
        {
            if(*q>*(q+1))
            {
                swap(q,(q+1));
            }
    }    

}
  • void bubbleSort(int *begin, int *end):该函数是一个无返回值的函数,它接收两个参数,分别是指向数组起始位置的指针 begin 和指向数组结束位置的指针 end

for(p=end;p>begin;p--)外层循环控制循环次数

p = end表示初始化p为数组最后一个元素的指针,每次循环结束后,p 向前移动一个位置

外层循环的目的是逐步缩小未排序的范围,因为在每一轮内层循环结束时,当前范围内最大的元素会被移动到正确的位置

for(q=begin;q<p;q++)

q=begin表示初始化q为数组第一个元素的指针

q用于遍历当前未排序部分的所有元素

插入排序

void insertSort(int *begin,int *end)
{
    int *p;
    int *q;
    int t;
    for(p=begin+1;p<=end;p++)
    {
        t = *p;
        q = p;
        while(q>0 && t<*(p-1))
        {
            swap(*p,*(p-1));
            q--;
        }
    }
    *q = t;
}
  • void insertSort(int *begin, int *end):该函数是一个无返回值的函数,它接收两个参数,一个是指向整型数组起始位置的指针 begin,另一个是指向数组结束位置的指针 end

q = p;

这行代码的目的是将指针 q 初始化为 p 的位置,即指向当前正在处理的元素。

q 在后续的 while 循环中会逐步向前移动,以找到适当的位置插入当前元素 t

通过 q 的移动,逐步腾出位置,以便将当前元素插入到正确的位置。

*q = *p;

这行代码会将 p 指向的值直接赋给 q 指向的值。这意味着值复制,而不是指针的初始化。

如果在这里写 *q = *p;,那就不会改变 q 本身指向的位置,而只是改变 q 所指向位置的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值