排序算法

一、排序算法的分类

 

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)

稳定性:稳定

posted @ 2019-10-07 11:46  xmalll  阅读(144)  评论(0)    收藏  举报