排序算法种类:
冒泡 选择 插入(希尔)
快速排序 分组排序 基数排序 桶排序 堆排序 归并排序
#include <stdio.h>
void print(int* a, int len, bool isBefore = true);
int main() {
int arr[10] = { 1,9,66,0,33,5,2,88,666,233 };
print(arr, 10);
print(arr, 10, false);
while (1);
return 0;
}
void print(int* a, int len, bool isBefore) {
if (isBefore)
printf("before sort:");
else
printf("after sort:");
for (int i = 0; i < len; i++)
printf("%d", a[i]);
printf("\n");
}
中间填充排序算法
冒泡排序(最简单):
思想(升序):
比较相邻的两个元素哪个比较大,若大的在后面,不管,若小的在后面交换
一轮过后,第len个数据就是最大的,
#include <stdio.h>
void print(int* a, int len, bool isBefore = true);
void bubble_sort(int* a, int len);
int main() {
int arr[10] = { 1,9,66,0,33,5,2,88,666,233 };
print(arr, 10);
printf("bubble_sort\n");
bubble_sort(arr, 10);
print(arr, 10, false);
while (1);
return 0;
}
//冒泡排序
void bubble_sort(int* a, int len)
{
int temp;
for (int i = 0; i < len; i++) {//外层循环
for (int j = 0; j < len - i - 1; j++) {
printf("i:%d,j:%d", i, j);
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
void print(int* a, int len, bool isBefore) {
if (isBefore)
printf("before sort:");
else
printf("after sort:");
for (int i = 0; i < len; i++)
printf("%d", a[i]);
printf("\n");
}
选择排序:从待排数组中选择最合适的
一轮选一个最小的,下一轮继续选个最小的,9轮之后即可
#include <stdio.h>
void select_sort(int* a, int len);
void print(int* a, int len, bool isBefore = true);
int main() {
int arr[10] = { 1,9,66,0,33,5,2,88,666,233 };
void select_sort(arr, 10);
print(arr, 10, false);
while (1);
return 0;
}
void select_sort(int* a, int len) {
int temp;
int minidx;
for (int i = 0; i < len - 1; i++) {
temp = a[i];
minidx = i;
for (int j = i; j < len; j++) {
minidx = (a[j] < a[minidx]) ? j : minidx;
}
a[i] = a[minidx];
a[minidx] = temp;
}
}
void print(int* a, int len, bool isBefore) {
if (isBefore)
printf("before sort:");
else
printf("after sort:");
for (int i = 0; i < len; i++)
printf("%d", a[i]);
printf("\n");
}
插入排序
先假设数组有序,每次往有序数组中插入一个
#include <stdio.h>
#include <algorithm>
void print(int* a, int len, bool isBefore = true);
void insert_sort(int* a, int len);
int main() {
int arr[10] = { 1,9,66,0,33,5,2,88,666,233 };
printf("insert_sort\n");
insert_sort(arr, 10);
print(arr, 10, false);
while (1);
return 0;
}
void insert_sort(int* a, int len) {
int temp;
int j;
for (int i = 1; i < len; i++) {
temp = a[i];
j = i - 1;
while (j >= 0 && a[j] > temp) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = temp;
print(a, 10);
}
}
void print(int* a, int len, bool isBefore) {
if (isBefore)
printf("before sort:");
else
printf("after sort:");
for (int i = 0; i < len; i++)
printf("%d", a[i]);
printf("\n");
}
希尔排序(对插入排序时间复杂度的优化)
引入步长概念,每次按照步长分组,组内做插入排序
步长每次变化,通常折半
#include <stdio.h>
void print(int* a, int len, bool isBefore = true);
void shell_sort(int* a, int len);
int main() {
int arr[10] = { 1,9,66,0,33,5,2,88,666,233 };
shell_sort(arr, 10);
print(arr, 10, false);
while (1);
return 0;
}
void shell_sort(int* a, int len) {
int step = len / 2;
int temp = 0;
int j;
while (step) {
for (int i = temp; i < len; i++) {
temp = a[i];
j = i - step;
while (j >= 0 && a[j] > temp) {
a[j + 1] = a[j];
j--;
}
a[j + step] = temp;
print(a, 10);
}
step = step / 2;
}
}
void print(int* a, int len, bool isBefore) {
if (isBefore)
printf("before sort:");
else
printf("after sort:");
for (int i = 0; i < len; i++)
printf("%d", a[i]);
printf("\n");
}