标签:
1、冒泡排序
//冒泡排序 void bubbleSort(int A[], int n) { bool flag = false; for (int i = n - 1; i > 0; i--) { //注意i,j的终止条件 for (int j = 0; j < i; j++) { if (A[j]>A[j + 1])swap(A[j], A[j + 1]); flag = true; } if (flag == false)return; } }
最差时间复杂度 O(n²) 记录是反序的,需要n-1次扫描,每趟扫描进行n-i次比较,每次比较都要移动3次
最优时间复杂度 O(n) 记录是正序的,一趟扫描即可完成,比较n-1次
平均时间复杂度 O(n²)
虽然冒泡排序不一定进行n-1趟,但记录移动次数多,故平均时间性能比直接插入排序差
最差空间复杂度 O(1)
优点:稳定;
缺点:慢,每次只能移动相邻两个数据
2、插入排序
//插入排序 void insertSort(int A[], int n) { for (int i = 1; i < n; i++) { //注意j从i-1开始 for (int j = i - 1; j >= 0;j--) if (A[i] < A[j]) swap(A[i], A[j]); } }
最差时间复杂度 O(n²)最优时间复杂度 O(n)平均时间复杂度 O(n²)最差空间复杂度 O(n) total, O(1) auxiliary
3、希尔排序
//希尔排序 void shellSort(int A[], int n) { int incrment = n; do{ incrment = n / 3 + 1; shellPass(A, n, incrment); } while (n >= 1); } void shellPass(int A[], int n, int d) { for (int i = d; i < n;i++) for (int j = i - d; j >= 0 && A[j]>A[i]; j -= d)//注意j每次自减d,A[j]>A[i]放在判断条件效率更高 { swap(A[i], A[j]); } }
希尔排序实际上是一种插入排序, 它的时间复杂度和数组初始排序有关。
平均时间复杂度:O(nlogn)
空间复杂度:O(1)
优点:快,数据移动少;
缺点:不稳定,d的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取。
标签:
原文地址:http://www.cnblogs.com/573177885qq/p/5666252.html