C-循环与排序

循环

do..while

性能比其他循环好,缺点就是无论条件如何都会运行一次代码,三个循环实现的功能一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"


void add()
{
int i =0;
do{
printf("%d\n",i);
i++;
}while(i<=100);

}

int main(int argc, char* argv[])
{
add();
return 0;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
0040B7B0   push        ebp
0040B7B1 mov ebp,esp
0040B7B3 sub esp,44h
0040B7B6 push ebx
0040B7B7 push esi
0040B7B8 push edi
0040B7B9 lea edi,[ebp-44h]
0040B7BC mov ecx,11h
0040B7C1 mov eax,0CCCCCCCCh
0040B7C6 rep stos dword ptr [edi]


0040B7C8 mov dword ptr [ebp-4],0
//第一个局部变量赋值
0040B7CF mov eax,dword ptr [ebp-4]
0040B7D2 push eax
0040B7D3 push offset string "%d\n" (0042001c)
0040B7D8 call printf (004010c0)
0040B7DD add esp,8
0040B7E0 mov ecx,dword ptr [ebp-4]
0040B7E3 add ecx,1
0040B7E6 mov dword ptr [ebp-4],ecx
0040B7E9 cmp dword ptr [ebp-4],64h
//对比参数和100的关系决定是否循环执行内存地址0x0040b7cf到0x0040B7ED的代码
0040B7ED jle add+1Fh (0040b7cf)


0040B7EF pop edi
0040B7F0 pop esi
0040B7F1 pop ebx
0040B7F2 add esp,44h
0040B7F5 cmp ebp,esp
0040B7F7 call __chkesp (00401140)
0040B7FC mov esp,ebp
0040B7FE pop ebp
0040B7FF ret

for

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"


void add()
{

for(int i=0;i<=100;i++)
{
printf("%d\n",i);
}

}

int main(int argc, char* argv[])
{
add();
return 0;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
0040B7B0   push        ebp
0040B7B1 mov ebp,esp
0040B7B3 sub esp,44h
0040B7B6 push ebx
0040B7B7 push esi
0040B7B8 push edi
0040B7B9 lea edi,[ebp-44h]
0040B7BC mov ecx,11h
0040B7C1 mov eax,0CCCCCCCCh
0040B7C6 rep stos dword ptr [edi]

0040B7C8 mov dword ptr [ebp-4],0
0040B7CF jmp add+2Ah (0040b7da)
//for循环先跳转到0040B7DA
0040B7D1 mov eax,dword ptr [ebp-4]
0040B7D4 add eax,1
0040B7D7 mov dword ptr [ebp-4],eax
0040B7DA cmp dword ptr [ebp-4],64h
//先判断第一个参数是否大于100,大于之家跳转到0040B7F3
0040B7DE jg add+43h (0040b7f3)
0040B7E0 mov ecx,dword ptr [ebp-4]
0040B7E3 push ecx
0040B7E4 push offset string "%d\n" (0042001c)
0040B7E9 call printf (004010c0)
0040B7EE add esp,8
0040B7F1 jmp add+21h (0040b7d1)

0040B7F3 pop edi
//还原现场结束程序
0040B7F4 pop esi
0040B7F5 pop ebx
0040B7F6 add esp,44h
0040B7F9 cmp ebp,esp
0040B7FB call __chkesp (00401140)
0040B800 mov esp,ebp

冒泡排序

第一个for循环可以把数组中最大的数放到数组的最后,第二个for循环可以打印数组,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "stdafx.h"


void Fun()
{
int arr[6] = {2,4,3,6,5,1};

for(int a=0;a<=5;a++)
{
int t=0;
if(arr[a]>arr[a+1])
{
t=arr[a];
arr[a]=arr[a+1];
arr[a+1]=t;
}
}


for(int j=0;j<6;j++)
{
printf("%d ",arr[j]);
}

}

int main(int argc, char* argv[])
{
Fun();
return 0;

}

执行两遍同样的for循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "stdafx.h"


void Fun()
{
int arr[6] = {2,4,3,6,5,1};

for(int a=0;a<=5;a++)
{
int t=0;
if(arr[a]>arr[a+1])
{
t=arr[a];
arr[a]=arr[a+1];
arr[a+1]=t;
}
}

for(int i=0;i<=5;i++)
{
int t=0;
if(arr[i]>arr[i+1])
{
t=arr[i];
arr[i]=arr[i+1];
arr[i+1]=t;
}
}

for(int j=0;j<6;j++)
{
printf("%d ",arr[j]);
}

}

int main(int argc, char* argv[])
{
Fun();
return 0;

}

也就是说我们重复执行第一个for循环就可以实现数组的排序,那么我们可以再写一个循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "stdafx.h"


void Fun()
{
int arr[6] = {2,4,3,6,5,1};


for(int a=0;a<6;a++)
{
for(int i=0;i<=5;i++)
{
int t=0;
if(arr[i]>arr[i+1])
{
t=arr[i];
arr[i]=arr[i+1];
arr[i+1]=t;
}
}
}



for(int j=0;j<6;j++)
{
printf("%d ",arr[j]);
}

}

int main(int argc, char* argv[])
{
Fun();
return 0;

}

优化

我们每执行一遍排序,需要排序的数字就会减一,那我们每循环一次就让排序的数字减一,这样能够提高效率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "stdafx.h"


void Fun()
{
int arr[6] = {2,4,3,6,5,1};


for(int a=0;a<6;a++)
{
for(int i=0;i<=5-a;i++)//每运行一次外层循环的a都会加一,我们内层循环就会少排序一个下标最高的数,第一轮循环a=0不影响排序所有的数
{
int t=0;
if(arr[i]>arr[i+1])
{
t=arr[i];
arr[i]=arr[i+1];
arr[i+1]=t;
}
}
}



for(int j=0;j<6;j++)
{
printf("%d ",arr[j]);
}

}

int main(int argc, char* argv[])
{
Fun();
return 0;

}

优化plus

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "stdafx.h"


void maopao(int arr[],int size)
{
int t=0;



for(int j=0;j<7;j++){

for(int i=0;i<size-j;i++){

if(arr[i]>arr[i+1]){
t=arr[i+1];
arr[i+1]=arr[i];
arr[i]=t;
}

}
}



}

int main(int argc, char* argv[])
{
int arr1[8]={8,2,1,4,5,3,6,7};

int size = sizeof(arr1) / sizeof(arr1[0]);

maopao(arr1,size);

for (int i = 0; i < size; i++) {
printf("%d ", arr1[i]);
}

getchar();

return 0;

}

结果

image-20231106101735996