转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6594533.html
一:插入排序==逐个往前相邻数比较交换,小的在前
第一轮:A[1]与A[0]比较,小的在前面;
第二轮:A[2]~A[0]相邻数比较,小的交换到前面,直到合适位置;
...
第n-1轮:A[n-1]往前比较,小则交换到前面,继续比较交换直到合适位置。
复杂度计算:T=1+2+...(n-1)=(n-1)(n-2)/2=O(n^2)
public int[] insertionSort(int[] A, int n) {
for(int i=0;i<n-1;++i){//i标记有序序列最后位置
for(int j=i+1;j>0;--j){//j为待插入元素
if(A[j]<A[j-1]){//从j开始不断与自己的前面元素比较交换
int temp;
temp=A[j-1];
A[j-1]=A[j];
A[j]=temp;
}
}
}
return A;
}
二:冒泡排序==相邻数比较交换,大者放在后面,每一次把当前轮最大者交换到末尾
排序开始:从0到n-1,进行相邻数比较交换操作,大者放在后面。
第二轮:从0到n-1,进行相邻数比较交换操作,大者放在后面。
......
第n-1轮:比较a[0]和a[1],大者放后面。此时整个数组有序。
复杂度计算:T=n+(n-1)+...+1=n(n-1)/2=O(n^2)
public class BubbleSort {
public int[] bubbleSort(int[] A, int n) { while(n>=1){//n控制当前是第几轮
for(int i=0;i<n-1;++i){//i负责当前轮的比较交换。注意这里是<n-1。而不是<=n-1。因为下面是i与i+1比较,如果遍历到n-1的话i+1就越界了
if(A[i]>A[i+1]){//比较,交换,让相邻两者大的在后面
int temp;
temp=A[i];
A[i]=A[i+1];
A[i+1]=temp;
}
}
--n;//当前轮结束,缩小范围
}
return A;
}
}
三:选择排序==每次选择待排序列最小者交换到待排序列的最前方
排序开始:从0到n-1遍历,选出最小者,交换到0位置;
第二轮:从1到n-1遍历,选择出最小者,交换到1位置;
...
第n-1轮:从n-2到n-1之间,选择最小者,放到n-2处。此时,0~n-1有序。
复杂度计算:T=n+(n-1)+...+1=n(n-1)/2=O(n^2)
public int[] selectionSort(int[] A, int n) { for(int i=0;i<=n-1;++i){//当前轮待排序的开始位置
int min=i;//记录待排序列最小值下标
for(int j=i;j<=n-1;++j){
if(A[min]>A[j]){
min=j;//选择最小值下标
}
}
if(min!=i){//如果待排序列开头不是最小值,则交换
int temp;
temp=A[i];
A[i]=A[min];
A[min]=temp;
}
}
return A;
}
(总结:三个O(n^2)的排序算法,插入、冒泡都是相邻元素比较交换达到合适位置的,选择则每次选出最小者交换到开头)