排序算法
一、排序算法的分类

1. 比较排序 VS 非比较排序
是否需要比较两个元素的大小才能进行排序
2. 交换排序 VS 插入排序 VS 选择排序
交换:每次只调换两个元素之间的位置
插入:遍历到的元素放入之前维护的已完成排序的序列中
选择:选择剩余元素中最大或最小的元素
3. 排序算法的稳定度
如果排序算法并不改变两个相同值的元素的相对位置,则此算法的稳定度高

二、冒泡排序
1.算法
每次遍历,从头至尾依次比较两两相邻元素是否满足排序条件,不满足则交换两者位置
当一次遍历中没有发生交换操作后,结束遍历

2.代码
C++:
1 void bubble(vector<int> &array) { 2 if (array.size() == 0) { 3 return; 4 } 5 bool flag = false; 6 while (!flag) { 7 flag = true; 8 for (int i = 0; i < array.size() - 1; i++) { 9 if (array[i] > array[i + 1]) { 10 int temp = array[i]; 11 array[i] = array[i + 1]; 12 array[i + 1] = temp; 13 flag = false; 14 } 15 } 16 } 17 }
JAVA:
1 void bubble(int[] array) { 2 if (array.length == 0) { 3 return; 4 } 5 boolean flag = false; 6 while (!flag) { 7 flag = true; 8 for (int i = 0; i < array.length - 1; i++) { 9 if (array[i] > array[i + 1]) { 10 int temp = array[i]; 11 array[i] = array[i + 1]; 12 array[i + 1] = temp; 13 flag = false; 14 } 15 } 16 } 17 }
Python:
1 def bubble(array): 2 if not array: 3 return 4 flag = False 5 while not flag: 6 flag = True 7 for i in range(0, len(array)-1): 8 if array[i] > array[i+1]: 9 array[i], array[i+1] = array[i+1], array[i] 10 flag = False
3.优化
每次遍历后,最后一次交换操作之后的所有元素均已完成排序,下一次遍历的终点可以前提至最后交换操作元素的索引位置
4.评估
时间复杂度:O(n2)
空间复杂度:O(1)
稳定性:稳定
三、快速排序
1.算法
每次选择一个基数,将剩余元素划分为大于基数和小于基数的两组
在两组中分别重复上述过程,直到分组无需排序为止

2.代码
C++:
1 void quick(vector<int> &array, int begin, int end) { 2 if(begin>=end){ 3 return; 4 } 5 int pivot = array[begin]; 6 int i = begin + 1; 7 int j = end; 8 while(i <= j){ 9 while(i<=j && array[i]<=pivot){ 10 i++; 11 } 12 while(i<=j && array[j]>pivot){ 13 j--; 14 } 15 if(i<=j) { 16 int temp = array[i]; 17 array[i] = array[j]; 18 array[j] = temp; 19 } 20 } 21 array[begin] = array[j]; 22 array[j] = pivot; 23 quick(array, begin, j-1); 24 quick(array, j+1, end); 25 }
JAVA:
1 void quick(int[] array, int begin, int end) { 2 if(begin>=end){ 3 return; 4 } 5 int pivot = array[begin]; 6 int i = begin + 1; 7 int j = end; 8 while(i <= j){ 9 while(i<=j && array[i]<=pivot){ 10 i++; 11 } 12 while(i<=j && array[j]>pivot){ 13 j--; 14 } 15 if(i<=j) { 16 int temp = array[i]; 17 array[i] = array[j]; 18 array[j] = temp; 19 } 20 } 21 array[begin] = array[j]; 22 array[j] = pivot; 23 quick(array, begin, j-1); 24 quick(array, j+1, end); 25 }
Python:
1 def quick(array, begin, end): 2 if begin >= end: 3 return 4 pivot = array[begin] 5 i = begin + 1 6 j = end 7 while i <= j: 8 while i <= j and array[i] <= pivot: 9 i += 1 10 while i <= j and array[j] > pivot: 11 j -= 1 12 if i <= j: 13 temp = array[i] 14 array[i] = array[j] 15 array[j] = temp 16 array[begin] = array[j] 17 array[j] = pivot 18 quick(array, begin, j - 1) 19 quick(array, j + 1, end)
3.优化
每次从头、尾及中间元素中,选择中位值作为基数
4.评估
时间复杂度:O(nlogn)
空间复杂度:O(longn)
稳定性:稳定
四、插入排序
1.算法
维护有序子列,每次从待排序子列中取出一个元素插入到有序子列的合适位置

2.代码
C++:
1 void insert(vector<int> &array) { 2 for(int i=1;i<array.size();i++){ 3 int j = i; 4 int temp = array[j]; 5 while(j>0 && array[j-1]>temp){ 6 array[j] = array[j-1]; 7 j--; 8 } 9 array[j] = temp; 10 } 11 }
JAVA:
1 void insert(int[] array) { 2 for(int i=1;i<array.length;i++){ 3 int j = i; 4 int temp = array[j]; 5 while(j>0 && array[j-1]>temp){ 6 array[j] = array[j-1]; 7 j--; 8 } 9 array[j] = temp; 10 } 11 }
Python:
1 def insert(array): 2 for i in range(1, len(array)): 3 j = i 4 temp = array[j] 5 while j > 0 and array[j-1] > temp: 6 array[j] = array[j-1] 7 j -= 1 8 array[j] = temp
3.优化
4.评估
时间复杂度:O(n2)
空间复杂度:O(1)
稳定性:稳定
五、希尔排序
1.算法
每次根据间距将序列划分为数个子列,分别在每个子列中进行插入排序
缩短间距大小,重复上述过程,直到间距为一

2.代码
C++:
1 void shell(vector<int> &array) { 2 int length = array.size(); 3 for(int gap = length/2;gap>=1;gap/=2){ 4 for(int i=gap;i<length;i++){ 5 int j = i; 6 int temp = array[j]; 7 while(j-gap>=0 && array[j-gap]>temp) { 8 array[j] = array[j - gap]; 9 j -= gap; 10 array[j] = temp; 11 } 12 } 13 } 14 }
JAVA:
1 void shell(int[] array) { 2 int length = array.length; 3 for(int gap = length/2;gap>=1;gap/=2){ 4 for(int i=gap;i<length;i++){ 5 int j = i; 6 int temp = array[j]; 7 while(j-gap>=0 && array[j-gap]>temp) { 8 array[j] = array[j - gap]; 9 j -= gap; 10 array[j] = temp; 11 } 12 } 13 } 14 }
Python:
1 def shell(array): 2 length = len(array) 3 gap = int(length/2) 4 while gap >= 1: 5 for i in range(gap, length): 6 j = i 7 temp = array[j] 8 while j-gap >= 0 and array[j-gap] > temp: 9 array[j] = array[j-gap] 10 j -= gap 11 array[j] = temp 12 gap = int(gap/2)
3.优化
4.评估
时间复杂度:O(n1.3)
空间复杂度:O(1)
稳定性:不稳定
六、选择排序
1.算法
维护有序子列,每次从待排序子列中取出最小元素插入到有序子列的末端

2.代码
C++:
1 void selection(vector<int> &array) { 2 int length = array.size(); 3 for(int i=0;i<length;i++){ 4 int min = array[i]; 5 int index = i; 6 for(int j=i+1;j<length;j++){ 7 if(array[j]<min){ 8 min = array[j]; 9 index = j; 10 } 11 } 12 if(index!=i) { 13 array[index] = array[i]; 14 array[i] = min; 15 } 16 } 17 }
JAVA:
1 void insert(int[] array) { 2 for(int i=1;i<array.length;i++){ 3 int j = i; 4 int temp = array[j]; 5 while(j>0 && array[j-1]>temp){ 6 array[j] = array[j-1]; 7 j--; 8 } 9 array[j] = temp; 10 } 11 }
Python:
1 def selection(array): 2 length = len(array) 3 for i in range(0, length): 4 minimal = array[i] 5 index = i 6 for j in range(i+1, length): 7 if array[j] < minimal: 8 minimal = array[j] 9 index = j 10 if index != i: 11 array[index] = array[i] 12 array[i] = minimal
3.优化
4.评估
时间复杂度:O(n2)
空间复杂度:O(1)
稳定性:稳定
七、归并排序
1.算法
将数组递归二分直到分解为数个单元素数组
再依次序按大小顺序将每对分解数组合并

2.代码
C++:
1 vector<int> merge(vector<int> array) { 2 if(array.size()>1){ 3 int middle = array.size()/2; 4 vector<int> front(array.begin(), array.begin()+middle); 5 vector<int> rear(array.begin()+middle, array.end()); 6 array = mergesort(merge(front), merge(rear)); 7 } 8 return array; 9 } 10 11 vector<int> mergesort(vector<int> front, vector<int> rear) { 12 int i=0,j=0; 13 vector<int> sorted; 14 while(i<front.size() && j<rear.size()){ 15 if(front[i] <= rear[j]){ 16 sorted.push_back(front[i]); 17 i++; 18 } 19 else{ 20 sorted.push_back(rear[j]); 21 j++; 22 } 23 } 24 while(i<front.size()){ 25 sorted.push_back(front[i]); 26 i++; 27 } 28 while(j<rear.size()){ 29 sorted.push_back(rear[j]); 30 j++; 31 } 32 return sorted; 33 }
JAVA:
1 void merge(int[] array, int begin, int end) { 2 if(array.length>1){ 3 int middle = (begin + end)/2; 4 merge(array, begin, middle); 5 merge(array, middle+1, end); 6 mergesort(array, begin, middle, end); 7 } 8 } 9 10 void mergesort(int[] array, int begin, int middle, int end) { 11 int i=begin,j=middle+1,k=begin; 12 int[] sorted = new int[array.length]; 13 while(i<=middle && j<=end){ 14 if(array[i] <= array[j]){ 15 sorted[k++] = array[i++]; 16 } 17 else{ 18 sorted[k++] = array[j++]; 19 } 20 } 21 while(i<=middle){ 22 sorted[k++] = array[i++]; 23 } 24 while(j<=end){ 25 sorted[k++] = array[j++]; 26 } 27 for(k=begin;k<=end;k++){ 28 array[k] = sorted[k]; 29 } 30 }
Python:
1 def merge(array): 2 if len(array) > 1: 3 middle = int(len(array) / 2) 4 front = array[:middle] 5 rear = array[middle:] 6 array = mergesort(merge(front), merge(rear)) 7 return array 8 9 10 def mergesort(front, rear): 11 i, j = 0, 0 12 result = [] 13 while i < len(front) and j < len(rear): 14 if front[i] <= rear[j]: 15 result.append(front[i]) 16 i += 1 17 else: 18 result.append(rear[j]) 19 j += 1 20 while i < len(front): 21 result.append(front[i]) 22 i += 1 23 while j < len(rear): 24 result.append(rear[j]) 25 j += 1 26 return result
3.优化
4.评估
时间复杂度:O(nlogn)
空间复杂度:O(n)
稳定性:稳定

浙公网安备 33010602011771号