1
1
# <a id =" top " ></a >排序算法 ✈
2
2
排序算法的分类
3
3
4
- ![ ] ( https://i.imgur.com/1OW23bg .png )
4
+ ![ ] ( https://i.imgur.com/UsDuUM6 .png )
5
5
6
6
## 冒泡排序
7
7
冒泡排序算法通过多次比较和交换来实现排序,其排序流程如下:
@@ -29,6 +29,7 @@ public void bubbleSort(int[] a,int n){
29
29
}
30
30
```
31
31
完整示例代码:[ bubble.java] ( ./bubble.java )
32
+
32
33
## 快速排序
33
34
快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
34
35
1 . 首先设定一个分界值,通过该分界值来将数组分成两部分。
@@ -64,10 +65,10 @@ public void quickSort(int[] a, int left, int right){ // 快速排序算法
64
65
ltemp++ ;
65
66
}
66
67
if (left< rtemp){
67
- quickSort(a, left, ltemp- 1 ); // 递归调用
68
+ quickSort(a, left, ltemp- 1 ); // 左递归调用
68
69
}
69
70
if (ltemp< right){
70
- quickSort(a, rtemp+ 1 , right); // 递归调用
71
+ quickSort(a, rtemp+ 1 , right); // 右递归调用
71
72
}
72
73
}
73
74
```
@@ -102,7 +103,7 @@ public void bubbleSort(int[] a,int n){
102
103
完整示例代码:[ select.java] ( ./select.java )
103
104
## 堆排序
104
105
堆排序(Heap Sort)算法是基于选择排序思想的算法,其利用堆结构和二叉树的一些性质来完成数据的排序。堆结构是一种树结构,准确的说是一个完全二叉树。在这个树中每个结点对应于原始数据的一个记录,并且每个结点应满足以下条件:
105
- - 如果按照从小到打的顺序排序 ,要求非叶结点的数据要大于或等于其左、右子结点的数据。
106
+ - 如果按照从小到大的顺序排序 ,要求非叶结点的数据要大于或等于其左、右子结点的数据。
106
107
- 如果按照从大到小的顺序排列,要求非叶结点的数据要小于或等于其左、右子结点的数据。
107
108
108
109
#### 堆排序过程
@@ -129,7 +130,7 @@ public void bubbleSort(int[] a,int n){
129
130
a[j+ 1 ]= a[j];
130
131
j-- ;
131
132
}
132
- a[j+ 1 ]= t;
133
+ a[j+ 1 ]= t; // 将腾出来的那个位置插入新元素
133
134
}
134
135
}
135
136
```
@@ -181,7 +182,7 @@ public void bubbleSort(int[] a,int n){
181
182
a[j+ r]= a[j];
182
183
j-= r;
183
184
}
184
- a[j+ r]= t;
185
+ a[j+ r]= t; // 将腾出来的那个位置插入新元素
185
186
}
186
187
}
187
188
}
@@ -194,3 +195,11 @@ public void bubbleSort(int[] a,int n){
194
195
195
196
一个待排序的原始数据序列进行合并排序的基本思路是,首先将含有n个结点的待排序数据序列看作由n个长度为1的有序子表组成,将其依次两两合并,得到长度为4的若干有序子表······,重复上述过程,一直到最后的子表长度为n,从而完成排序过程。
196
197
198
+ # 算法时间复杂度分析
199
+ - 冒泡排序算法:冒泡排序中,存在二层循环遍历,所以平均时间复杂度为O(n²),最坏情况下的时间复杂度为O(n²);
200
+ - 快速排序算法:快序中,while循环部分时间复杂度为O(logn),左递归和右递归总和的时间复杂度为O(n),所以总的平均时间复杂度为O(n²);
201
+ - 选择排序算法:选择排序中,依次从数组中选取最小的,次小的,... 从而得到整个序列。两层循环遍历,所以时间复杂度为O(n²),最坏情况下的时间复杂度为O(n²);
202
+ - 堆排序算法:从堆中,一次堆排序挑选最小(或最大)元素的时间复杂度为O(logn),一共要进行n次堆排序得到有序队列,所以平均时间复杂度为O(nlogn),最坏情况下的时间复杂度为O(nlogn);
203
+ - 插入排序算法:插入排序中,两层循环,第一层遍历n个元素,第二层遍历在已排序队列中逐一向前比较,找到合适的位置插入,所以平均时间复杂度为O(n²),最坏情况下的时间复杂度为O(n²);
204
+ - 折半插入排序算法:在插入排序的基础上进行优化,在第二层遍历在已排序队列中通过二分查找的方式,找到合适的位置插入,所以平均时间复杂度为O(n²),最坏情况下的时间复杂度为O(n²);
205
+ - 合并排序算法:均时间复杂度为O(nlogn),最坏情况下的时间复杂度为O(n²);:
0 commit comments