알고리즘을 정렬하면 (a)에 배울 수 : 버블 정렬

즉은, 데이터 세트가 배열되는 일정한 규칙에 따라 정렬 소위. 분류 알고리즘의 공식적인 정의는 다음과 같다 :하자가 정렬되지 않은 시퀀스들의 세트가 \ $ {X_1, X_2, ..., x_n \} $, 그리고 함수가 $ F (x)는 $위치 조절 요소 서열의 시리즈 이후, 이러한 서열은 새로 얻어을 만족하는 $ 0 \ I \ J \ n $, 아르 $ F (x_i로부터) \ F (x_j) $(승순) 또는 $ F (x_i로부터) \ GE의 F (x_j) $(내림차순). 다른 데이터 소스의 서로 다른 특성의 경우, 사람들은 시간 복잡도 또는 최적화의 공간 복잡성 위해, 다른 종류의 알고리즘을 설계한다. 공통 정렬 알고리즘 : 빠른 정렬 일종의 거품, 삽입 정렬, 버킷 정렬 알고리즘. 다양한 정렬 알고리즘의 다음과 같은 원칙을 설명하고, 자신의 강점과 약점을 분석하고 있습니다. (이하 소트 알고리즘의 설명에서, 데이터는 오름차순으로 배열되어있는 것으로한다).

버블 정렬

버블 링 알고리즘의 단계는 다음이다 : 두 개의 인접한 요소의 크기 비교, 비교 결과에 따라 오름차순으로 두 요소가 점차 끝쪽으로 이동 후퇴. 즉,도 1, 각 차륜의 정렬 공정에 도시하는 처리 알고리즘을 버블 링 제가 i 번째로 큰 원소 배열에서 최대의 현재의 위치로 이동된다. 정렬 프로세스의 각 라운드에서, 정렬 된 시퀀스 길이의 오른쪽은 결국 전체 순서가 정렬 된 순서가 만드는 성장을 계속하고 있습니다. 전체 버블 정렬 프로세스는 다음과 같습니다 :

버블 정렬 알고리즘 구현 프로세스

그림 1 버블 정렬의 과정을 완료

 

 

가장 기본적인 버블 정렬 알고리즘을 달성하기 위해

다음과 같이도 1에 기재된 공정은, 기본 파이썬 코드 버블 소팅 알고리즘이 구현된다 :

[sourcecode language='python'  padlinenumbers='true']
	def bubbleSort(data:List[int])->List[int]:
		length = len(data)
		for i in range(0, length):
			for j in range (0, length - 1):
				if data[j] > data[j+1]:
					tmp = data[j]
					data[j] = data[j+1]
					data[j+1] = tmp
		return data
[/sourcecode]

对优化后的代码分析可知,一共需要进行$ n 개의 $轮的排序,每一轮的排序中都需要进行$ N-1 $次的大小比较,因此该算法的算法复杂度为$ O (n ^ 2) $,空间复杂度为$ 1 $

针对每轮比较次数的效率优化

通过对图1的观察,第1轮排序完成后,最右侧的1个元素是一个已完成排序的序列,在第2轮的排序过程中,最后1次的比较没有发生顺序的改变;第2轮排序完成后,最右侧的2个元素是一个已完成排序的序列,在第3轮的排序过程中,最后2次的比较没有发生顺序的改变。第$ I $轮排序完成后,最右侧的$ I $个元素是一个已完成排序的序列,在第$ I + 1 $轮的排序过程中,最后$ I $次的比较没有发生顺序的改变。根据这个特点,我们可以对每一轮的排序过程中需要比较的次数进行优化。代码如下:

def bubbleSort(data:List[int])->List[int]:
            length = len(data)
            for i in range(0, length):
                for j in range (0, length - i - 1):
                    if data[j] > data[j + 1]:
                        tmp = data[j] data[j] = data[j+1] data[j+1] = tmp return data

在进行优化之后,可以发现在每一轮的排序过程中需要比较的元素的数量得到了优化,在第$ I $轮中排序中进行了$ I-1 $次大小比较,因此在整个排序过程中,一共需要进行$ \ sum_ {1} ^ {N} (I-1) $次比较运算,算法复杂度为$ O (n ^ 2) $,空间复杂度为$ 1 $

针对算法终止条件的效率优化

另外,还可以对冒泡排序算法的终止条件进行优化。我们对图1进行观察,发现从第3轮开始,序列的顺序已经达到排序完成的状态,此后序列中元素的相对位置不再发生改变,因此我们可以根据此对排序的终止条件的判断进行优化。代码如下:

    def bubbleSort(data:List[int])->List[int]):
            length = len(data)
            changed = 0
            for i in range(0, length):
                for j in range (0, length - i - 1):
                    if data[j] > data[j + 1]: tmp = data[j] data[j] = data[j+1] data[j+1] = tmp changed = 1 if changed == 0: return data return data

在进行优化之后,可以发现排序算法可能提前终止排序状态。考虑最好的情况,序列的顺序本来就是排列好的,那么需要进行一轮排序来进行确认,一共需要进行$ N-1 $次排序,因此在最好的情况下算法的时间复杂度为$ O (n) $,空间复杂度为$ 1 $;在最差的情况下,一共需要进行$ \ sum_ {1} ^ {N} (I-1) $次比较运算,算法复杂度为$ O (n ^ 2) $,空间复杂度为$ 1 $

鸡尾酒排序

鸡尾酒排序又称为双向冒泡排序,是冒泡排序的一个变种算法,可以在某些情况下减少算法的比较次数。鸡尾酒排序算法的过程如图2所示:

칵테일 정렬 알고리즘 구현 프로세스

​图2 鸡尾酒排序算法的执行过程

对图2观察可知,利用鸡尾酒排序在第三轮的时候,序列就已经达到了排序完成的状态。比普通的冒泡排序算法快了一轮,下面分析为什么会比冒泡算法快一轮的原因。在冒泡算法过程中,元素单一的从一侧按照从小到大的顺序被移动到另一侧。但是如果假设有这样一种情况,即序列的左侧的大部分元素的相对顺序都是排好的,只有右侧部分元素的顺序不对,那么此时鸡尾酒排序相对于冒泡排序就会有极大的优势。极端一点的例子,如:序列$ [2,3,4,5,1] $,如果按照冒泡排序来进行,那么需要进行4轮排序,如果按照鸡尾酒排序的算法来排序则只需要2轮排序。但是对于某些极端情况,如序列$ [5,4,3,2,1] $,冒泡排序和鸡尾酒排序都需要进行4轮排序。

鸡尾酒排序算法的Python代码如下(以下代码已经针对每轮的比较次数和算法终止条件进行了优化):

    def cocktailsort(data:List[int])->List[int]):
            start = 0
            end = len(data)
            changed = 0
            while start != end:
                for i in range(start, len(data) - 1): if data[i] > data[i + 1]: tmp = data[i] data[i] = data[i + 1] data[i + 1] = tmp changed = 1 print(data) if changed == 0: return data start = start + 1 changed = 0 for i in range(end - 1, 0, -1): if data[i] < data[i - 1]: tmp = data[i] data[i] = data[i - 1] data[i - 1] = tmp changed = 1 print== 변경된 경우 (데이터)의 리턴 : 0 1 개 반환 데이터 - 데이터의 끝 = 끝

 

추천

출처www.cnblogs.com/struggling2019/p/12007030.html