排序(1)
一. 冒泡排序:
规则:两两比较,大的向后移动,小的往前移动(像鱼吐的泡泡一样--所以叫冒泡排序)
时间复杂度: O(n^2)
空间复杂度: O(1)
稳定性: 稳定
void BubbleSort(int ar[], int len) { assert(ar != NULL && len > 1); bool tag = true; for (int i = 0; i < len - 1; i++)//比较趟数 { tag = true; for (int j = 0; j < len - i - 1; j++)//每一趟的比较次数 (j+1<len-i) { if (ar[j] > ar[j + 1])//若进行过交换,说明无序tag = false,若未交换过,说明此时已经有序. { int tmp = ar[j + 1]; ar[j + 1] = ar[j]; ar[j] = tmp; tag = false; } } if (tag) { break; } } }
二. 直接插入排序(选择插入排序):
ps: 如果数组基本有序,就用直接插入排序,越有序时间复杂度越低,极端情况下时间复杂度为O(n)
时间复杂度 O(n^2)
空间复杂度 O(1)
稳定性: 稳定
void InsertSort(int ar[], int len) { int tmp = 0; for (int i = 1; i < len; i++) { tmp = ar[i]; if (ar[i-1] > tmp) { int j = i-1; for (; j >= 0; j--)//从后向前找 { if (ar[j] > tmp)//如果大于tmp则向后移动 { ar[j + 1] = ar[j]; } else //否则退出 { break; } } ar[j + 1] = tmp; } } }
三. 希尔排序(缩小增量排序):一种特殊的直接插入排序,只不过调用了直接插入排序
时间复杂度: O(n^1.3 - 1.5)
空间复杂度: O(1)
稳定性: 不稳定 ,进行了跳跃交换
static void Shell(int ar[], int len, int gap)//增量,间隔 { assert(gap >= 1); int tmp = 0; int j = 0; for (int i = gap; i < len; i++)// i 开始的位置 { tmp = ar[i]; if (ar[i - gap] > tmp) { for (j = i - gap; j >= 0; j -= gap) { if(ar[j] > tmp) { ar[j + gap] = ar[j]; } else { break; } } ar[j + gap] = tmp; } } } void ShellSort(int ar[], int len) { assert(ar != nullptr && len > 1); int dk[] = { 5,3,1 };//增量数组 for (int i = 0; i < sizeof(dk) / sizeof(dk[0]); i++) { Shell(ar, len, dk[i]); } }
未完待续...