Sắp xếp nổi bọt sử dụng Pass-by-Reference

10 403 1
Sắp xếp nổi bọt sử dụng Pass-by-Reference

Đang tải... (xem toàn văn)

Thông tin tài liệu

© 2004 Trần Minh Châu. FOTECH. VNU 24 Chương 5. 5.6 Sắp xếp nổi bọt sử dụng truyền tham chiếu • bubbleSort dùng con trỏ –Hàmswap truy nhập các phần tử của mảng • Các phần tử đơn của mảng: dữ liệu vô hướng (scalars) –Mặc định là pass by value •Truyền tham chiếubằng toán tử địa chỉ & ©2004 Trần Minh Châu. FOTECH. VNU. 25 fig05_15.cpp (1 of 3) 1 // Fig. 5.15: fig05_15.cpp 2 // This program puts values into an array, sorts the values into 3 // ascending order, and prints the resulting array. 4 #include <iostream> 5 6 using std::cout; 7 using std::endl; 8 9 #include <iomanip> 10 11 using std::setw; 12 13 void bubbleSort( int *, const int ); // prototype 14 void swap( int * const, int * const ); // prototype 15 16 int main() 17 { 18 const int arraySize = 10; 19 int a[ arraySize ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 }; 20 21 cout << "Data items in original order\n"; 22 23 for ( int i = 0; i < arraySize; i++ ) 24 cout << setw( 4 ) << a[ i ]; 25 ©2004 Trần Minh Châu. FOTECH. VNU. 26 fig05_15.cpp (2 of 3) 26 bubbleSort( a, arraySize ); // sort the array 27 28 cout << "\nData items in ascending order\n"; 29 30 for ( int j = 0; j < arraySize; j++ ) 31 cout << setw( 4 ) << a[ j ]; 32 33 cout << endl; 34 35 return 0; // indicates successful termination 36 37 } // end main 38 39 // sort an array of integers using bubble sort algorithm 40 void bubbleSort( int *array, const int size ) 41 { 42 // loop to control passes 43 for ( int pass = 0; pass < size - 1; pass++ ) 44 45 // loop to control comparisons during each pass 46 for ( int k = 0; k < size - 1; k++ ) 47 48 // swap adjacent elements if they are out of order 49 if ( array[ k ] > array[ k + 1 ] ) 50 swap( &array[ k ], &array[ k + 1 ] ); Khai báo là int *array (thay vì int array[]) để cho hàm bubbleSort nhận mảng 1 chiều. Hai cách khai báo này là như nhau. Nhận tham số kích thước của mảng; khai báo là const để chắc chắn rằng size sẽ không bị thay đổi. ©2004 Trần Minh Châu. FOTECH. VNU. 27 fig05_15.cpp (3 of 3) fig05_15.cpp output (1 of 1) 51 52 } // end function bubbleSort 53 54 // swap values at memory locations to which 55 // element1Ptr and element2Ptr point 56 void swap( int * const element1Ptr, int * const element2Ptr ) 57 { 58 int hold = *element1Ptr; 59 *element1Ptr = *element2Ptr; 60 *element2Ptr = hold; 61 62 } // end function swap Data items in original order 2 6 4 8 10 12 89 68 45 37 Data items in ascending order 2 4 6 8 10 12 37 45 68 89 Truyền tham chiếu, cho phép hàm tráo giá trị tại vùng nhớ. © 2004 Trần Minh Châu. FOTECH. VNU 28 Chương 5. 5.6 Sắp xếp nổi bọt sử dụng truyền tham chiếu • sizeof – Toán tử trả về kích thước byte của toán hạng –Với mảng, sizeof trả về giá trị ( kích thước 1 phần tử ) * ( số phần tử ) –Nếu sizeof( int ) = 4, thì int myArray[10]; cout << sizeof(myArray); sẽ in ra 40 • sizeof có thể dùng với –Tên biếncout <<"sizeof c = " << sizeof c –Tên kiểu dữ liệucout << sizeof( char ) –Hằng số ©2004 Trần Minh Châu. FOTECH. VNU. 29 fig05_16.cpp (1 of 2) 1 // Fig. 5.16: fig05_16.cpp 2 // Sizeof operator when used on an array name 3 // returns the number of bytes in the array. 4 #include <iostream> 5 6 using std::cout; 7 using std::endl; 8 9 size_t getSize( double * ); // prototype 10 11 int main() 12 { 13 double array[ 20 ]; 14 15 cout << "The number of bytes in the array is " 16 << sizeof( array ); 17 18 cout << "\nThe number of bytes returned by getSize is " 19 << getSize( array ) << endl; 20 21 return 0; // indicates successful termination 22 23 } // end main 24 sizeof trả về tổng số byte của mảng. Hàm getSize trả về số byte được dùng để lưu địa chỉ mảng array. ©2004 Trần Minh Châu. FOTECH. VNU. 30 fig05_16.cpp (2 of 2) fig05_16.cpp output (1 of 1) 25 // return size of ptr 26 size_t getSize( double *ptr ) 27 { 28 return sizeof( ptr ); 29 30 } // end function getSize The number of bytes in the array is 160 The number of bytes returned by getSize is 4 sizeof trả về số byte của con trỏ. © 2004 Trần Minh Châu. FOTECH. VNU 31 Chương 5. 5.7 Các phép toán đối với con trỏ • Các phép toán con trỏ –Tăng/giảm con trỏ (++ hoặc --) –Cộng/trừ 1 số nguyên với 1 con trỏ ( + hoặc += , - hoặc -=) – Con trỏ có thể trừ lẫn nhau –Cộng trừ với con trỏ là vô nghĩa trừ khi dùng cho con trỏ mảng •Ví dụ: Mảng 5 phần tử int trên máy dùng kiểu int 4 byte – vPtr trỏ đến phần tử thứ nhất v[ 0 ], tại địa chỉ 3000 vPtr = 3000 – vPtr += 2; trỏ vPtr tới 3008 vPtr trỏ tới v[ 2 ] biến con trỏ vPtr v[0] v[1] v[2] v[4]v[3] 3000 3004 3008 3012 3016 vùng nhớ © 2004 Trần Minh Châu. FOTECH. VNU 32 Chương 5. 5.7 Các phép toán đối với con trỏ •Trừ con trỏ (Subtracting pointers) –Trả về số phần tử giữa 2 địa chỉ vPtr2 = v[ 2 ]; vPtr = v[ 0 ]; vPtr2 - vPtr == 2 • Gán con trỏ (Pointer assignment) –Một con trỏ có thể được gán cho con trỏ khác nếu cả hai cùng kiểu –Nếu không cùng kiểu thì phải đổi kiểu (cast) –Ngoại lệ:con trỏ tới void (kiểu void *) • con trỏ tổng quát, đại diện cho kiểu bất kỳ • không cần đổi kiểu để chuyển sang con trỏ sang dạng void pointer • Không thể (dùng *) lấy dữ liệu của con trỏ kiểu void © 2004 Trần Minh Châu. FOTECH. VNU 33 Chương 5. 5.7 Các phép toán đối với con trỏ • So sánh con trỏ (Pointer comparison) –Sử dụng các toán tử quan hệ để so sánh địa chỉ chứa trong con trỏ –Ví dụ: có hai con trỏ trỏ đến hai phần tử của một mảng, chỉ ra con trỏ trỏ đến phần tử được đánh số thứ tự cao – So sánh là vô nghĩa trừ khi các con trỏ trỏ đến các phần tử của cùng một mảng –Thường dùng để xác định khi con trỏ có giá trị bằng 0 (null) (không trỏ đến đâu cả) . © 2004 Trần Minh Châu. FOTECH. VNU 24 Chương 5. 5.6 Sắp xếp nổi bọt sử dụng truyền tham chiếu • bubbleSort dùng con trỏ –Hàmswap truy nhập. tại vùng nhớ. © 2004 Trần Minh Châu. FOTECH. VNU 28 Chương 5. 5.6 Sắp xếp nổi bọt sử dụng truyền tham chiếu • sizeof – Toán tử trả về kích thước byte của

Ngày đăng: 29/09/2013, 07:20

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan