1.排序的分类
在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的。
稳定的排序 | 时间复杂度 | 空间复杂度 |
冒泡排序 | 最差和平均是O(n2),最好是O(n) | 1 |
双向冒泡排序 | 最差和平均是O(n2),最好是O(n) | 1 |
插入排序 | 最差和平均是O(n2),最好是O(n) | 1 |
归并排序 | 最差、平均、最好都是O(nlogn) | O(n) |
桶排序 | O(n) | O(k) |
基数排序 | O(dn)(d是常数) | O(n) |
二叉树排序 | O(nlogn) | O(n) |
图书馆排序 | O(nlogn) |
(1+e)n |
不稳定的排序 | 时间复杂度 | 空间复杂度 |
选择排序 | 最差和平均是O(n2),最好是O(n) | 1 |
希尔排序 | O(nlogn) | 1 |
堆排序 | 最差、平均、最好都是O(nlogn) | 1 |
快速排序 | 平均O(nlogn),最差是O(n2) | O(nlogn) |
2.常见排序算法分析:
1.冒泡法
冒泡法就是第一个数开始,不断地和后面地数比较,大的数往后,一轮后最大的数跑到最后;为了使序列在正序列前提下,能减少排序的次数,需要用一个BOOL型变量来判断是否发生了交换
1 #include<iostream>
2 using namespace std;
3
4
5 void sort(int a[],int n)
6 {
7 int i,j,temp;
8 bool exchange;
9 for(i=0;i<n-1;i++)
10 {
11 exchange = false;
12 for(j=0;j<n-i-1;j++)
13 {
14 if(a[j+1]<a[j])
15 {
16 temp = a[j+1];
17 a[j+1] = a[j];
18 a[j] = temp;
19 }
20 exchange = true;
21 }
22 if(!exchange)
23 return;
24 }
25 }
26
27
28
29 int main()
30 {
31 int a[] = {13,31,45,26,78,56,90,24,15,81};
32 sort(a,10);
33 for(int i=0;i<10;i++)
34 cout<<a[i]<<‘ ‘;
35 cout<<endl;
36 return 0;
37 }
2.直接插入法
注意用while来实现寻找插入的位置,减少辅助变量
1 #include<iostream>
2 using namespace std;
3
4
5 void sort(int a[],int n)
6 {
7 int i,j;
8 for(i=1;i<=n-1;i++)
9 {
10 j = i-1;
11 int temp = a[i];
12 while(temp<a[j])
13 {
14 a[j+1]=a[j];
15 j--;
16 }
17 a[++j]=temp;
18 }
19 }
20
21
22
23 int main()
24 {
25 int a[] = {13,31,45,26,78,56,90,24,15,81};
26 sort(a,10);
27 for(int i=0;i<10;i++)
28 cout<<a[i]<<‘ ‘;
29 cout<<endl;
30 return 0;
31 }
时间: 2024-10-17 07:44:48