本篇内容为牛客网,左程云算法课程课堂笔记。
(1)对冒泡排序的理解
首先要记住的是,冒泡排序每次让一个元素到他最终该待的地方去。
过程是,第一次的时候是前n个元素,从头到尾,第一个元素和第二个元素,相比较,大的那个数后移,直到第n个元素,没有元素可以和他相互比较,则开始下一趟。下一趟是,前n-1个元素进行比较,直到第n-1个元素,则停止,该元素放在n-1的位置上。
冒泡排序的时间发杂度为:O(n^2),但算法可以改进,使最佳情况时为O(n)。
基础代码为:
public int[] bubbleSort(int[] A, int n) {
for (int i = 0; i < A.length; i++) {
for (int j = 0; j < A.length-1-i; j++) {
if (A[j]>A[j+1]) {
int tmp=A[j];
A[j]=A[j+1];
A[j+1]=tmp;
}
}
}
return A;
}
冒泡排序的改进:
第一步的改进:冒泡排序,如果在比较的过程中,某一次没有发生过交换,说明已经是有序的了,那么久不需要再进行比较,直接跳出就行了。
public int[] bubbleSort(int[] A, int n) {
//实现冒泡排序
for (int i = 0; i < A.length; i++) {
boolean flag=false;
for (int j = 0; j < A.length-1-i; j++) {
if (A[j]>A[j+1]) {
int tmp=A[j];
A[j]=A[j+1];
A[j+1]=tmp;
flag=true;//如果某一次发生了交换。则说明还没有最终有序,因此,置为true;
}
}
if (!flag) {
break;
}
}
return A;
}
这次改进,就只填了一个标志位。使用标志位来判断是否需要进行后面的循环。这种根据新进的值来改变标志位的做法,在很多地方都是可用的:比如,判断一个序列是否是降序序列,可以设初始值为true,如果,在当前为止之前,都是升序。则为true,如果一旦发现了,降序,则flage就会变为flase.然后可以根据这个变化,来相应的设置一些值,来监督数列的变化过程。
(3)
//实现冒泡排序
int lastpos=0;//表示上一次排序时,在lastpos之前的元素已经有序。
int lastpostmp=0;//跟踪记录,新的一次遍历中,有序的位置。
for (int i = 0; i < A.length; i++) {
lastpos=lastpostmp;
for (int j = 0; j < A.length-1-i; j++) {
if (A[j]>A[j+1]) {
int tmp=A[j];
A[j]=A[j+1];
A[j+1]=tmp;
lastpostmp=j;
}
}
if (lastpos==lastpostmp) {//说明下一次,没有再发生过交换,这之前的位置都基本有序了。
break;
}
}
return A;
若记录序列的初始状态为"正序",则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为"逆序",则需进行n(n-1)/2次比较和记录移动。因此冒泡排序总的时间复杂度为O(n*n)。