1.冒泡排序
算法思想:反复扫描待排序记录序列,在扫描的过程中顺次比较相邻的两个元素的大小,若逆序就交换位置。第一趟排序不断地将相邻两个记录中关键字大的记录向后移动,第二趟将前n-1个记录进行同样的操作,结果次大的记录被放在n-1个记录的位置。如此反复,每趟排序都将一个记录排序到位,直到剩下一个最小的记录。
private static void BubbleSort(int[] a) {
int temp=0;
for (int i = 0; i < a.length-1; i++) {
for (int j = 0; j < a.length-i-1; j++) {
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
算法分析:例如数组[48,62,35,77,55,14,35,98,22,40],第一趟后[48,35,62,55,14,35,77,22,40,98],第二趟后[35,48,55,14,35,62,22,40,77,98],第三躺[35,48,14,35,55,22,40,62,77,98],第四趟[35,14,35,48,22,40,55,62,77,98],第五趟[14,35,35,22,40,48,55,62,77,98],第六趟[14,35,,22,35,40,48,55,62,77,98],最后[14,22,35,35,40,48,55,62,77,98]
时间复杂度O(n^2) 空间复杂度O(1) 稳定
2.快速排序
算法思想:从待排序记录序列中选取一个记录(通常取第一个)为枢轴,其关键字K1,然后将其余关键字小于k1的记录移到前面,大于的数字放在后面,结果将待排序记录序列分为两个子表,最后将关键字为K1的记录插到其分界线的位置。
private static void QKSort(int[] a,int low,int high) {
int pos;
if(low<high){
pos=QKPass(a,low,high);
QKSort(a,low,pos-1);
QKSort(a,pos+1,high);
}
}
//一趟快速排序
private static int QKPass(int[] a, int low, int high) {
int x=a[low];//选择基准位置
while(low<high){
while(low<high&&a[high]>x)
high--;//high从右到左找小于x的记录
if(low<high){//找到小于x的记录,则送入空单元a[low]
a[low]=a[high];
low++;
}
while(low<high&&a[low]<x)//low从左到右找大于x的记录
low++;
if(low<high){//找到大于x的记录,则送入空单元a[high]
a[high]=a[low];
high--;
}
}
a[low]=x;//将基准记录保存到low=high的位置
return low;//返回基准记录的位置
}
算法分析:例如序列{48,62,35,77,55,14,35,98}
一次划分后:{35,14,35}48{55,77,62,98}分别进行快速排序
第二次划分:{14} 35 {35} 48 55{62}77{98}
快速排序递归算法的执行过程对应一棵二叉树,理想情况下是一棵完全二叉树,递归工作栈的大小与上述递归调用二叉树的深度对应,平均情况下辅助空间复杂度为O(log2n) 时间复杂度O(nlog2n) 不稳定