排序分为内部排序和外部排序。
内部排序就是在内存中排序,如果数据很大,不能全部读入内存,就需要访问外村,称为外部排序。
- — -1.冒泡排序- — -
基本思想:
两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端。
时间复杂度O(n²)
空间复杂度O(1)
def sort(arry):
n=len(arry)
- — -2.快速排序- — -
基本思想:
通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
一趟排序的过程:
排序全过程:
def quicksort(arry):
imp=arry[0],
for i in range(1,len(arry)):
- — -3.直接插入排序- — -
基本思想:
将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
import random
def insert_sort(nums):
"""
# 插入排序
:param nums:
:return:
"""
count = len(nums)
for i in range(1, count):
key = nums[i]
j = i - 1
while j >= 0:
if nums[j] > key:
nums[j + 1] = nums[j]
nums[j] = key
j -= 1
return nums
if __name__ == '__main__':
nums = [random.randint(1, 1000) for i in range(1000)]
sort_nums = insert_sort(nums)
print(sort_nums)
- — -4.希尔排序- — -
基本思想:
算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行.直接插入排序后,排序完成。
def shellSort(arr):
"""
5 4 3 2 1
"""
step = int(len(arr) / 2) # step
while step > 0:
print("step=", step)
arr_len = len(arr)
# index = 0 1 2 3 4
for index in range(arr_len):
# index=0 index+step=3
# index=1 indx+step=4
if index + step < arr_len:
current_val = arr[index]
if current_val > arr[index + step]:
arr[index], arr[index + step] = arr[index + step], arr[index]
step = int(step / 2)
else:
# 直接插入排序
return insert_sort(arr)
- — -5.选择排序- — -
基本思想 :
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序毕。
def findSmallest(arr):
smallest = arr[0]
smallest_index = 0
for i in range(1, len(arr)):
if arr[i] < smallest:
smallest = arr[i]
smallest_index = i
return smallest_index
def selectSort(arr):
newArr = []
for i in range(len(arr)):
smallest = findSmallest(arr)
newArr.append(arr.pop(smallest))
return newArr