1.普通版:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 #include<time.h> 4 using namespace std; 5 #define MAX 20 6 //打印数组 7 void printFunc05(int* arr, int len) 8 { 9 for (int i = 0; i < len; i++) 10 cout << arr[i] << " "; 11 cout << endl; 12 } 13 14 //排序,从小到大 15 void SelectSort05(int* arr, int len) 16 { 17 for (int i = 0; i < len - 1; i++) 18 { 19 for (int j = i + 1; j < len; j++) //要点1. 20 { 21 if (arr[i] > arr[j]) //要点2. 22 { 23 int temp = arr[i]; 24 arr[i] = arr[j]; 25 arr[j] = temp; 26 } 27 } 28 } 29 cout << "普通的选择排序" << endl; 30 } 31 32 33 //创建数组 34 void test05() 35 { 36 int arr[MAX]; 37 srand((unsigned int)time(NULL)); 38 for (int i = 0; i < MAX; i++) 39 { 40 arr[i] = rand() % MAX; 41 } 42 printFunc05(arr, MAX); 43 //排序 44 SelectSort05(arr, MAX); 45 printFunc05(arr, MAX); 46 47 } 48 49 50 int main() 51 { 52 53 test05(); 54 55 system("pause"); 56 return EXIT_SUCCESS; 57 }
2.加强版:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 #include<time.h> 4 using namespace std; 5 #define MAX 20 6 //打印数组 7 void printFunc06(int* arr, int len) 8 { 9 for (int i = 0; i < len; i++) 10 cout << arr[i] << " "; 11 cout << endl; 12 } 13 14 //排序, 从小到大 15 void SelectSort06(int* arr, int len) 16 { 17 for (int i = 0; i < len - 1; i++) 18 { 19 int max = i; //要点1. 20 for (int j = i + 1; j < len; j++) 21 { 22 if (arr[max] > arr[j]) //要点2. 23 { 24 max = j; 25 } 26 } 27 28 if (max != i) //要点3. 29 { 30 int temp = arr[max]; 31 arr[max] = arr[i]; 32 arr[i] = temp; 33 } 34 } 35 cout << "加强版选择排序" << endl; 36 } 37 38 //创建数组 39 void test06() 40 { 41 int arr[MAX]; 42 srand((unsigned int)time(NULL)); 43 for (int i = 0; i < MAX; i++) 44 { 45 arr[i] = rand() % MAX; 46 } 47 printFunc06(arr, MAX); 48 //排序 49 SelectSort06(arr, MAX); 50 printFunc06(arr, MAX); 51 52 } 53 54 int main() 55 { 56 57 test06(); 58 59 system("pause"); 60 return EXIT_SUCCESS; 61 }
两种方法的不同之处:(判断循环处进行的步骤不同, 增加了代码的运行效率)
1.普通选择排序:
每次判断,符合条件时都会进行数据的交换,多运行了几行代码,浪费时间
2.加强版选择排序:
1)每次判断时,符合条件时只会交换数据的下标, 少运行了代码
2)只有当每次内层循环完毕时, 它才会进行数据的交换,减少了代码的运行。
3.选择排序的特点:
1)每次内层循环完毕:都会寻找到(最小或最大的元素, 将它放在元素的指定位置)
2)如:第一次内层循环完毕,数据中(最大或最小的元素,一定会放在数据的开头或结尾(一般都是开头))。