/* 排序模板
冒泡排序(稳定),快排,归并排序
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5
void Print(int num[], int len){
for(int i = 0; i < len; i ++){
printf("%d ", num[i]);
}
printf("\n");
}
void Bubble_Sort(int num[], int len){ // 冒泡排序,稳定排序
for(int i = 0; i < len; i ++){
for(int j = 1; j < len - i; j ++){
if(num[j] < num[j - 1]){
int temp = num[j];
num[j] = num[j - 1];
num[j - 1] = temp;
}
}
}
}
void Quick_Sort(int num[], int left, int right) { // 快速排序, 不稳定排序,也就是c++里的sort函数
if (left >= right)
return;
int le = left, ri = right;
int key = num[right];
while (le <= ri){
for (; num[ri] > key; --ri);
for (; num[le] < key; ++le);
if (le <= ri) {
int temp = num[le];
num[le] = num[ri];
num[ri] = temp;
++le, --ri;
}
}
Quick_Sort(num, le, right);
Quick_Sort(num, left, ri);
}
void Merge_Sort(int num[], int start, int end){ // 归并排序, 稳定排序
if(start >= end){
return;
}
int middle = (start + end) / 2;
Merge_Sort(num, start, middle); // 递归分成最小块
Merge_Sort(num, middle + 1, end);
int len1 = middle - start + 1;
int len2 = end - middle;
int *L = new int[len1 + 1];
int *R = new int[len2 + 1];
for(int i = 0; i < len1; i ++){
*(L + i) = *(num + start + i);
}
for(int i = 0; i < len2; i ++){
*(R + i) = *(num + middle + i + 1);
}
*(L + len1) = 0xfffffff;
*(R + len2) = 0xfffffff;
int i = 0, j = 0;
for(int k = start; k <= end; k ++){ // 合并
if(L[i] <= R[j]){
num[k] = L[i ++];
}
else{
num[k] = R[j ++];
}
}
delete[] L;
delete[] R;
}
int main()
{
srand(time(NULL));
int num[N];
for(int i = 0; i < N; i ++){
num[i] = rand() % 100;
}
printf("Before Sort:\n");
Print(num, N);
printf("After Sort:\n");
Bubble_Sort(num, N);
// Quick_Sort(num, 0, N - 1);
// Merge_Sort(num, 0, N - 1);
Print(num, N);
}
排序
最新推荐文章于 2024-03-29 10:00:00 发布