急死我了机试之BubbleSort


Leetcode原题链接

0.忘差不多的基础知识

  • 数组作为实参、形参

传入的就是指向数组首元素的指针,所以排序后的数组回到main中会保持排序后的状态。

  • 数组的依次输入

在1.0.中解释

  • 指向数组元素的指针如何表示数组元素

自己的错误点是使用了(*pList)[j-1]去访问numList[j-1]。正确的理解应为 :pList是指向numList[0]的指针,因此(pList)表示的是List[0],可以等价看成pList=numList,numList怎么用pList就怎么用。
当想用pList访问数组元素时,有pList[i]与
(pList+i)两种方式。

  • int *pList也可以写成int pList[]

1.正文

看完题干考虑到以下几点问题:

  1. why chose BubbleSort?
    (1)array is sorted
    (2)max is easy to find(head or tail)
  2. how to input?
    use array to get a list[]
  3. how to output?
    (1)output format :max(sortedArray[N-1])\n 1~N-1
    (2)special case when N==1

1.0.input

input format:
在这里插入图片描述
接收到首个参数N后,使用在下一步的for(N次){数组元素依次赋值}中。

//1.input
scanf("%d",&N);
for(i=0;i<N;i++){
	scanf("%d",&numList[i]);
	
}

1.1.BubbleSort

原则为:两两进行比较,按升(降)序需求进行交换操作。

例子 5 2 4 1

第1轮:
2 5 4 1
2 4 5 1
2 4 1 5
进行3次比较
第2轮
2 4 1 5
2 1 4 5
进行2次比较
第3轮
1 2 4 5
进行1次比较

使用i表示轮数,j表示每轮中的比较次数。
观察发现:

  1. i+j==N
  2. i<=N-1
  3. j<=N-1

这三个条件将使用在for循环的条件中。

//共进行N-1次冒泡
for(i=0;i<N-1;i++){
	//  每轮比较的次数
	for(j=1;j<=N-1-i;j++){
	}
}

循环中根据题干要求的升序或降序,进行if条件中的设置,本代码为从左到右边升序。

		if(pList[j-1]>pList[j]){
			temp=pList[j];
			pList[j]=pList[j-1];
			pList[j-1]=temp;

1.2. output

ouput fomat要求输出max,剩余升序。
在sortedArray中:

  1. max=sortedArray[N-1]
  2. 顺序输出sortedArray[1->N-2]即是升序排列。

除此之外,ouput fomat中有一个测试案例为:
在这里插入图片描述
所以需要加一个N?=1的判断

//3.output
printf("%d\n",numList[N-1]);
if(N==1){
	printf("-1");
}
else{
	for(i=0;i<N-1;i++){
		printf("%d ",numList[i]);

	}

}

2.完整代码

#include <stdio.h>

#define Nmax 1000


void BubbleSort(int *pList,int N){
	int i,j,temp;
	//共进行N-1次冒泡
	for(i=0;i<N-1;i++){
		//  每轮比较的次数
		for(j=1;j<=N-1-i;j++){
			//自己选择升序还是降序
			//本代码为从左到右边升序
			if(pList[j-1]>pList[j]){
				temp=pList[j];
				pList[j]=pList[j-1];
				pList[j-1]=temp;

			}


		}
	}
	
}


int main() {
	int N,i;
	int numList[Nmax];
	
	//1.input
	scanf("%d",&N);
	for(i=0;i<N;i++){
		scanf("%d",&numList[i]);
		
	}
	//2.func

	//传递数组其实就是有效地传递指向其第一个元素的指针
	BubbleSort(numList,N);

	//3.output
	printf("%d\n",numList[N-1]);
	if(N==1){
		printf("-1");
	}
	else{
		for(i=0;i<N-1;i++){
			printf("%d ",numList[i]);

		}

	}

	

}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周树皮不皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值