排序的稳定性和复杂度:
不稳定:
选择排序(selection sort)— O(n2)
快速排序(quicksort)— O(nlogn) 平均时间, O(n2) 最坏情况; 对于大的、乱序串列一般认为是最快的已知排序
堆排序 (heapsort)— O(nlogn)
希尔排序 (shell sort)— O(nlogn)
基数排序(radix sort)— O(n·k); 需要 O(n) 额外存储空间 (K为特征个数)
稳定:
插入排序(insertion sort)— O(n2)
冒泡排序(bubble sort) — O(n2)
归并排序 (merge sort)— O(nlogn); 需要 O(n) 额外存储空间
二叉树排序(Binary tree sort) — O(nlogn); 需要 O(n) 额外存储空间
桶排序 (bucket sort)— O(n); 需要 O(k) 额外存储空间
1、插入排序
对于一个序列{a[0]……a[n]},当记录值是第i个元素时,前面i-1个元素已经排好序了,那么这个记录值从第i-1个元素一直往前比较,找到属于它的位置后插进去。
复制代码
1 #include
2 using namespace std;
3
4 int main()
5 {
6 int a[]={1,99,2,88,3,77,4,66};
7 int n=sizeof(a)/4;
8 for(int i=0; i
9 {
10 int tp=a[i], j;
11 for(j=i-1; j>=0&&a[j]>tp; j--) a[j+1]=a[j];
12 a[j+1]=tp;
13 }
14 cout << a[0] ;
15 for(int i=1; i
16 cout <
17 return 0;
18 }
复制代码
2、选择排序
对于一个序列{a[0]……a[n]},前面i-1个元素都是已经排好序的,那么从第i到第n个元素,找到最小值的那个元素,如果下标不是i,则让第i个元素和那个最小的元素位置互换。
复制代码
1 #include
2 using namespace std;
3
4 int main()
5 {
6 int a[]={1,99,2,88,3,77,4,66};
7 int n=sizeof(a)/4;
8 for(int i=0; i
9 {
10 int pos=-1, minn=a[i];
11 for(int j=i+1; j
12 {
13 if(a[j]
14 }
15 if(pos!=-1) swap(a[i],a[pos]);
16 }
17 cout << a[0] ;
18 for(int i=1; i
19 cout <
20 return 0;
21 }
复制代码
3、冒泡排序
冒泡排序顾名思义就是从最后往前两个元素开始进行两两比较,如果a[i]小于a[i-1],那么让他们互换位置,每比较一轮必有一个最小的元素冒泡到这些所比较元素的前面。
复制代码
1 #include
2 using namespace std;
3
4 int main()
5 {
6 int a[]={1,99,2,88,3,77,4,66};
7 int n=sizeof(a)/4;