(一)BubbleSort冒泡排序
1.核心思想:
根据要求,对数组进行相邻的两两元素之间的比较,如果反序就进行交换,直到数组没有反序的相邻的元素为止。
2.冒泡排序的优化:
①内层循环的条件不需要再写成j<length数组长度,因为随着比较符合条件的最大值或者最小值已经被交换到了数组的尾巴,所以内层循环的执行次数应该是越来越少的,写成j<length-1-i就可以。(length需要-1是为了避免出现越界比较的情况,再-i是因为后面已经有i个有序的元素了,所以不需要进行比较了)
②针对数组原本就全部有序:
可以在进入循环之前定义一个bool类型的flag变量并且初始化为true,进入第一层循环将这个flag置为false,如果在进入第二层循环之后,进行了交换就将这个变量置为true,出了第二层循环对这个flag变量进行判断,如果变量的值为false,那么就说明遍历了一遍数组之后相邻的两个元素都没有反序的,直接退出循环;
如果数组部分有序:
其实就可以把flag声明为一个int类型的值,每次进行交换的时候把flag赋值为j+1即最大交换位置,执行完第二层循环之后改变i的值为length-flag-1,这样又减少了循环和交换的次数。
3.代码实现:排序完成从小到大
1 #include<iostream> 2 using namespace std; 3 4 void BubbleSort(int arr[],int len) 5 { 6 if(arr == NULL || len <= 0) return ; 7 int i,j; 8 for(i=0;i<len;i++) 9 { 10 for(j=0;j<len-i-1;j++) 11 { 12 if(arr[j] > arr[j+1]) 13 { 14 int t = arr[j]; 15 arr[j] = arr[j+1]; 16 arr[j+1] = t; 17 } 18 } 19 } 20 21 return ; 22 } 23 24 void PrintArr(int arr[],int len) 25 { 26 for(int i=0;i<len;i++) 27 cout << arr[i] << " "; 28 cout << endl; 29 30 return ; 31 } 32 33 int main() 34 { 35 //int arr[10] = {9,8,7,6,5,4,3,2,1,0}; 36 int arr[10] = {4,8,6,3,7,2,9,5,0,1}; 37 BubbleSort(arr,sizeof(arr)/sizeof(arr[0])); 38 PrintArr(arr,sizeof(arr)/sizeof(arr[0])); 39 40 system("pause"); 41 return 0; 42 }