冒泡,选择,插入,时间复杂度O(n2)算法感悟(此博文对于排序过程有大概了解的同学具体学习以及进阶)
**1. 冒泡排序** 冒泡排序思路(由小到大排序):
1.以123451为例
2.先确定排序的个数n,由个数可得外层循环的次数为n-1,当前比较次数为i
3.内层循环次数m由外层循环n控制,随着大数冒泡到数组末尾,内层循环的次数也随之减少,n-1-i
开始:1—2—3—4—5—1
第一次:1—2—3—4—1—5
第二次: 1—2—3—1—4—5
第三次: 1—2—1—3—4—5
第四次: 1—1—2—3—4—5
第五次(最终结果):1—1—2—3—4—5
代码核心:
for(int i=0;i<a.length-1;i++){
for(int j=0;j<a.length-1-i;j++){
if(a[j]>a[j+1]){
int temp=a[j+1];
a[j+1]=a[j];
a[j]=temp; } } }
**2. 选择排序**
选择排序思路(由小到大):
1.以123451为例:
2.选择排序,选择数组中键值a[i]。
3.a[i]前半部分是有序数组,所以只需排序数组后半部分即可(只要a[i]在任何位置,它的前半部分都是有序的)。前面括号内的语句是选择排序的核心原理。
4.排序a[i]后半部分, 只需要找出后半部分最小值,将其数组位置保存num中,而后和a[i]交换排序。
5. 过程: 选择a[0]位键值开始排序
开始:1—2—3—4—5—1
第一次:1—2—3—4—5—1
第二次: 1—1—3—4—5—2
第三次: 1—1—2—4—5—3
第四次: 1—1—2—3—5—4
第五次(最终结果):1—1—2—3—4—5
核心代码:
int num=0;
int temp=a[0];
for(int i=0;i<a.length;i++){
int temp=a[i];
for(int j=i+1;j<a.length;j++){
if(a[j]<temp){
num=j;
temp=a[j]; }
int tem=a[i];
a[i]=a[num];
a[num]=tem;
} }
思考问题:1、为什么冒泡排序外层控制和选择排序外层控制的条件不一样?
**3. 插入排序**
插入排序思路(由小到大):
1. 以123451为例:
2.插入排序,是将待排数字插入有序数组中的排序方法。
3.实现过程:
开始:1—2—3—4—5—1
第一次:1—2—3—4—5—1
第二次: 1—2—3—4—5—1
第三次: 1—2—3—4—5—1
第四次: 1—2—3—4—5—1
第五次(最终结果):1—1—2—3—4—5
核心代码:
for(int i=0;i<n;i++){
for(int j=i;j>0;j--){
if(A[j]<A[j-1]){
temp=A[j-1];
A[j-1]=A[j];
A[j]=temp; } } }
2、思考冒泡和插入排序的区别?