#define SIZE(a) (sizeof(a)/sizeof(a[0]))
#define SWAP(a, b) { \
a += b, b = a - b, a -= b; \
}
//打乱数组,等概率
void shuffle(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
int x;
do x = rand() % (n - i) + i; while (x == i); // [i, n-1]
SWAP(arr[i], arr[x]);
}
}
int main(void) {
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
print_array(arr, SIZE(arr));
printf("\n");
srand(time(NULL));
shuffle(arr, SIZE(arr));
print_array(arr, SIZE(arr));
return 0;
}
//插入排序
void insertion_sort(int arr[], int n) {
for (int i = 1; i < n; i++) {
int val = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > val) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = val;
print_array(arr, n);
}
}
//冒泡排序
void bubble_sort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
bool flag = true;
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
flag = false;
SWAP(arr[j], arr[j + 1]);
}
}
if (flag) break;
}
}
//希尔排序
void shell_sort(int arr[], int n) {
int gap = n >> 1;
while (gap) {
for (int i = gap; i < n; i++) {
int value = arr[i];
int j = i - gap;
while (j >= 0 && arr[j] > value) {
arr[j + gap] = arr[j];
j -= gap;
}
arr[j + gap] = value;
}
gap >>= 1;
}
}
//归并排序
int tmp[10];
void merge_sort(int a[], int l, int r) {
if (l >= r) return;
int mid = l + r >> 1;
merge_sort(a, l, mid);
merge_sort(a, mid + 1, r);
int k = 0, i = l, j = mid + 1;
while (i <= mid && j <= r) {
if (a[i] <= a[j]) tmp[k++] = a[i++];
else tmp[k++] = a[j++];
}
while (i <= mid) tmp[k++] = a[i++];
while (j <= r) tmp[k++] = a[j++];
for (i = l, j = 0; i <= r; i++, j++) a[i] = tmp[j];
}
//快速排序
void quick_sort(int a[], int l, int r) {
if (l >= r) return;
int x = a[l + r >> 1];
int i = l - 1, j = r + 1;
while (i < j) {
do i++; while (a[i] < x);
do j--; while (a[j] > x);
if (i < j) SWAP(a[i], a[j]);
}
quick_sort(a, l, j);
quick_sort(a, j + 1, r);
}
//选择排序
void selection_sort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
int min = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[min]) min = j;
}
if (min != i) SWAP(arr[i], arr[min]);
}
}
//堆排序
int right;
void heap_helper(int arr[], int i) {
int min = i;
if (right >= 2 * i + 1 && arr[i] > arr[2 * i + 1]) min = 2 * i + 1; //min值>左孩子,更新min
if (right >= 2 * i + 2 && arr[min] > arr[2 * i + 2]) min = 2 * i + 2; //min值>右孩子,更新min
if (i != min){ //待调整点不是最小
SWAP(arr[i], arr[min]);
heap_helper(arr, min);
}
}
void heap_sort(int arr[], int n) {
right = n - 1;
for (int i = n >> 1 - 1; i >= 0; i--) heap_helper(arr, i);
while (n--) {
printf("%d ", arr[0]);
SWAP(arr[0], arr[right]);
right--;
heap_helper(arr, 0);
}
}
【C语言】27_插入排序 & 冒泡排序 & 希尔排序 & 归并排序 & 快速排序 & 选择排序 & 堆排序 & 数组打乱函数
于 2024-05-11 09:33:00 首次发布