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.正文
看完题干考虑到以下几点问题:
- why chose BubbleSort?
(1)array is sorted
(2)max is easy to find(head or tail) - how to input?
use array to get a list[] - 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表示每轮中的比较次数。
观察发现:
- i+j==N
- i<=N-1
- 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中:
- max=sortedArray[N-1]
- 顺序输出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]);
}
}
}