-
冒泡排序
- 比较相邻的元素,前一个比后一个大就交换
- 对每一对相邻的元素做1操作
- 针对所有元素采取上面操作,每次循环至少会有一个元素放在排序正确的位置上
- 若某次循环没有做任何交换,则排序完成
void bubbleSort(int *p, int n){
int pTemp;
bool flag;
for (int i = 0; i < n - 1; i++){
flag = false;
for (int j = 0; j < n - 1 - i; j++){
if (p[j] > p[j + 1]){
pTemp = p[j];
p[j] = p[j + 1];
p[j + 1] = pTemp;
flag = true;
}
}
if (flag == false)
return;
}
}
时间复杂度:O() 空间复杂度:O(1) 稳定
-
直接插入排序
- 从第一个元素开始,该元素可以被认为是已排序
- 取出未排序的第一个元素,从已排序序列中从后向前扫描
- 如未排序元素小于已排序元素,则将已排序元素后移
- 重复3,直到找到正确插入的位置
- 重复2-4,知道序列有序
void insertSort(int *p, int n){
int temp, pre;
for (int i = 1; i < n; i++){
pre = i - 1;
temp = p[i];
while (pre >= 0 && p[pre]>temp){
p[pre + 1] = p[pre];
pre--;
}
p[pre + 1] = temp;
}
}
时间复杂度:O() 空间复杂度:O(1) 稳定
-
简单选择排序
- 在未排序序列中找到最小的元素,做标记
- 将标记的元素放入已排序序列的末尾
- 重复执行1、2,直到序列有序
void selectionSort(int *p, int n){
int min, temp;
for (int i = 0; i < n - 1; i++){
min = i;
for (int j = i + 1; j < n; j++){
if (p[j]<p[min]){
min = j;
}
}
temp = p[min];
p[min] = p[i];
p[i] = temp;
}
}
时间复杂度:O() 空间复杂度:O(1) 不稳定
-
希尔排序
简单插入排序的改进版,与简单插入排序不同之处是,希尔排序会优先比较距离比较远的元素,希尔排序又叫缩小增量排序
- 确定步长,将整个未排序序列分为若干个子序列
- 子序列分别进行直接插入排序
- 步长减小,再执行1、2
- 步长减小到1时,子序列长度变为整个序列的长度
void shellSort(int *p, int n){
int gap = 1;
int temp;
int pre;
while (gap < n / 3){
gap = 3 * gap + 1;
}
gap = gap / 3;
while (gap >= 1){
for (int i = 0; i < n; i++){
temp = p[i];
pre = i - gap;
while (pre >= 0 && p[pre]>temp){
p[pre + gap] = p[pre];
pre = pre - gap;
}
p[pre + gap] = temp;
}
gap--;
}
}
时间复杂度:O() 空间复杂度:O(1) 不稳定