二进制C-循环与排序
xiu循环
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 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) 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 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++) { 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;
}
|
结果
