0% found this document useful (0 votes)
4 views

C++[第5章]重要演算法的實作

Uploaded by

Cabie Wu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views

C++[第5章]重要演算法的實作

Uploaded by

Cabie Wu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 13

05

C++

5-1

1. N N-1 N-1

2.

3.

5-1

5-10
CHAPTER 05

̹̹實例演練
5data

Step 01

swapdatax y

1 void swap(int data[], int x, int y){


2 int temp = data[x];
3 data[x] = data[y];
4 data[y] = temp;
5 }

Step 02

one_bubble

1 void one_bubble(int data[], int end_index){


2 for(int j = 0; j < end_index; j++){ // end_index ( )

3 if(data[j] > data[j+1]){ //


4 swap(data, j, j+1); // ( )
5 }
6 }
7 }

Step 03

print_array

1 void print_array(int data[], int arr_len){


2 for(int i = 0; i < arr_len; i++){
3 cout << data[i] << " ";
4 }
5 cout << endl;
6 }

Step 04

54

89
1 int main(){
2 int data[5] = {4, 1, 3, 5, 2};
3 int data_count = sizeof(data) / sizeof(int); // = = 5
4 for(int i = 0; i < data_count - 1; i++){ // 54

5 one_bubble(data, data_count-1-i); // i

6 cout << " " << i << ": "; //


7 print_array(data, data_count);
8 }
9 cout << "" << endl;
10
11 return 0;
12 }

TIP
int data_count = sizeof(data) / sizeof(int);
sizeof(data) / sizeof(int)data

Step 05

程式碼
1 /*
2 Ch5-1-bubbleSort.cpp
3 ( )
4 : swap, one_bubble, print_array
5 : 1.0
6 */
7
8 #include <iostream>
9
10 using namespace std;
11
12 // ----- swap: datax, y -----
13 void swap(int data[], int x, int y){
14 int temp = data[x];
15 data[x] = data[y];
16 data[y] = temp;
17 }

90
CHAPTER 05

18
19 // ----- one_bubble: -----
20 void one_bubble int data[], int end_index){
(
21 for(int j = 0; j < end_index; j++){ // end_index ( )

22 if(data[j] > data[j+1]){ //


23 swap(data, j, j+1); // ( )
24 }
25 }
26 }
27
28 // -----print_array: data -----
29 void print_array(int data[], int arr_len){
30 for(int i = 0; i < arr_len; i++){
31 cout << data[i] << " ";
32 }
33 cout << endl;
34 }
35
36 int main(){
37 // ===== =====
38 int data[5] = {4, 1, 3, 5, 2};
39 int data_count = sizeof(data) / sizeof(int); // = = 5
40 // ----------
41 for(int i = 0; i < data_count - 1; i++){ // 54

42 one_bubble(data, data_count-1-i); // i
43 cout << " " << i << ": "; //
44 print_array(data, data_count);
45 }
46 cout << "" << endl;
47 // ===== =====
48 return 0;
49 }

執行結果

0: 1 3 4 2 5
1: 1 3 2 4 5
2: 1 2 3 4 5
3: 1 2 3 4 5

91
5-1

5-1

5-1

one_bubble

j=0 4 1 3 5 2
j=1 1 4 3 5 2
i=0 i=0
j=2 1 3 4 5 2
5
j=3 1 3 4 5 2
0 1 3 4 2 5
j=0 1 3 4 2 5
i=1 i=1
j=1 1 3 4 2 5
4 2
j=2 1 3 4 2 5
1 1 3 2 4 5
j=0 1 3 2 4 5 i=2
i=2
j=1 1 3 2 4 5 3 3
2 1 2 3 4 5
i=3 j=0 1 2 3 4 5 i=3
2 4
3 1 2 3 4 5

5-2

92
CHAPTER 05

̹̹實例演練
data
target

Step 01 seq_search

datatarget-1

1 int seq_search(int data[], int data_count, int target){


2 for(int i = 0; i < data_count; i++){
3 if(data[i] == target){ // i target
4 return i; // i
5 }
6 }
7 return -1; // for-1
8 }

Step 02

1 int data[5] = {12, 2, 7, 5, 9};


2 int data_count = sizeof(data) / sizeof(int); // = = 5
3 int target = 7;
4 int found_index = seq_search(data, data_count, target);

Step 03

1 if(found_index == -1){
2 cout << "" << target << endl;
3 }
4 else{
5 cout << "" << target << ", " << found_index <<
"" << endl;
6 }

Step 04

93
程式碼

1 /*
2 Ch5-2-seqSearch.cpp
3
4 : seq_search
5 : 1.0
6 */
7
8 #include <iostream>
9
10 using namespace std;
11
12 // ----- seq_search:
datatarget-1 -----
13 int seq_search(int data[], int data_count, int target){
14 for(int i = 0; i < data_count; i++){
15 if(data[i] == target){ // i target
16 return i; // i
17 }
18 }
19 return -1; // for-1
20 }
21
22 int main(){
23 // ===== =====
24 int data[5] = {12, 2, 7, 5, 9};
25 int data_count = sizeof(data) / sizeof(int); // = = 5
26 int target = 7;
27 // ----------
28 int found_index = seq_search(data, data_count, target);
29 if(found_index == -1){
30 cout << "" << target << endl;
31 }
32 else{
33 cout << "" << target << ", " << found_index <<
"" << endl;
34 }
35 // ===== =====
36 return 0;
37 }

94
CHAPTER 05

執行結果

7 2

̹̹實例演練
target data
target

Step 01 binary_search

binary_searchtarget
targetleft right
(right - left)/2 + left (right + left)/2
(int) (right - left)/2 + left

1 int binary_search(int data[], int left, int right, int target){


2 if(left > right){ //
3 return -1;
4 }
5
6 int middle = (int)((right-left) / 2 + left);// left~right
(middle)
7 if(data[middle] > target){ // ->
8 return binary_search(data, left, middle-1, target);
9 }
10 else if(data[middle] < target){ // ->
11 return binary_search(data, middle+1, right, target);
12 }
13 else{ // (data[middle] == target)
14 return middle;
15 }
16 }

95
Step 02

1 int data[11] = {2, 3, 5, 7, 9, 11, 12, 15, 20, 22, 25}; //

2 int data_count = sizeof(data) / sizeof(int);


3 int target = 7;
4 int found_index = binary_search(data, 0, data_count-1, target); //
0~data_count-1 ( )

Step 03

1 if(found_index == -1){
2 cout << "" << target << endl;
3 }
4 else{
5 cout << "" << target << ", " << found_index <<
"" << endl;
6 }

Step 04

程式碼

1 /*
2 Ch5-3-binarySearch.cpp
3
4 : binary_search
5 : 1.0
6 */
7
8 #include <iostream>
9
10 using namespace std;
11
12 // ----- binary_search: target -----
13 int binary_search int data[], int left, int right, int target){
(
14 if(left > right){ //
15 return -1;
16 }
17
18 int middle = (int)((right-left) / 2 + left);// left~right
(middle)

96
CHAPTER 05

19 if(data[middle] > target){ // ->


20 return binary_search data, left, middle-1, target);
(
21 }
22 else if(data[middle] < target){ // ->
23 return binary_search(data, middle+1, right, target);
24 }
25 else{ // (data[middle] == target)
26 return middle;
27 }
28 }
29
30 int main(){
31 // ===== =====
32 int data[11] = {2, 3, 5, 7, 9, 11, 12, 15, 20, 22, 25}; //

33 int data_count = sizeof(data) / sizeof(int);


34 int target = 7;
35 // ----------
36 int found_index = binary_search(data, 0, data_count-1,
target); //0~data_count-1 ( )
37 if(found_index == -1){
38 cout << "" << target << endl;
39 }
40 else{
41 cout << "" << target << ", " << found_index <<
"" << endl;
42 }
43 // ===== =====
44 return 0;
45 }

執行結果

7 3

5-2

5-2

97
5-2

( ) ( )
7
0 1 2 3 4 5 6 7 8 9 10

7<1111
0 10 2 3 5 7 9 11 12 15 20 22 25

7>55
0 4 2 3 5 7 9 11 12 15 20 22 25

3 4 2 3 5 7 9 11 12 15 20 22 25

2
N N
log2N 2-5

5,000,000
100

1
0.17 4 0.0000077

98
時況報

1.

90 30 40
20 40 90
70 80 70
60 30 20

a. int data_sum[4] = {0, 0,


0, 0};0
b. swap ( ) one_bubble( )
c.

1 int main(){
2 int data_2d[4][3] = {
3 {90, 30, 40},
4 {20, 40, 90},
5 {70, 80, 70},
6 {60, 30, 20}
7 };
8 int data_sum[4] = {0, 0, 0, 0};
9 int data_count = sizeof(data_sum) / sizeof(int);
10
11 string animal_names[4] = {"" , "" , "" , "" };
12 int animal_num = sizeof(animal_names) / sizeof(string);
13 // ----------
14 for(int i = 0; i < animal_num; i++){
15 for(int j = 0; j < 3; j++){
16 data_sum[i] += data_2d[i][j];
17 }
18 }
19 // ----------
20 cout << ":" << endl;
21 print_arr_string(animal_names, animal_num);

99
22 print_arr_int(data_sum, data_count);
23 cout << endl;
24 // ----------
25 for(int i = 0; i < data_count-1; i++){
26 one_bubble(data_sum, animal_names, i, data_count);
27 }
28 // ----------
29 for(int i = 0; i < 3; i++){
30 cout << " " << i+1 << " : " << animal_names[data_count-i-1] << endl;
31 }
32
33 return 0;
34 }

100

You might also like