面试笔试准备(2)排序算法

本篇内容为牛客网,左程云算法课程课堂笔记。

(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)。


你可能感兴趣的:(面试笔试准备(2)排序算法)