稳定排序:插入排序、冒泡排序、归并排序
如果有两个数字的数值大小相同,排序后的相对顺序为被改变。
一.插入排序
时间复杂度:n^2
1.将数组分成【已排序区】和【待排序区】
2.将【已排序区】后面一个元素,向前插入到【待排序区】中
3.直到【待排序区】没有元素为止
二.冒泡排序(非随机存储的排序)
时间复杂度:n^2
将数组分成【已排序区】和【待排序区】
2.从头到尾扫面【待排序区】,若前面的元素比后面的大,则交换
3.每一轮都会将【待排序区】中最大的放到【已排序区】的开头
4.直到【待排序区】没有元素为止
优化:
(1)请写从下两轮往后,冒泡过程没有任何交换操作
(2)当某一轮冒泡过程中没有任何交换操作的时候,结束整个冒泡排序过程
三.归并排序
时间复杂度:nlog(n)
1.递归分治 每个部分分成2个或三个
2.归并:需要一片额外的存储区,用两个指针指向两个有序数组头部,比较两个有序数组头部,将较小的数字放入新的存储区,接着将指针后移
3.拷贝:将新存储区的元素复制到原存储区中去
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define swap(a,b){ \
__typeof(a) __temp = a; \
a = b; b = __temp; \
}
void insert_sort(int *num, int n){
for(int i = 1; i < n; i++){//将num[0]看成是已排序过的元素;
for(int j = i - 1; j >= 0; j--){//num[i-1]是已排序元素的最后一个元素;遍历到num[0]为止;
if(num[j + 1] > num[j]){//num[j+1]是待排序的第一个元素插入到已排序区域;
swap(num[j + 1], num[j]);
}else{
break;
}
}
}
return ;
}
void bubble_sort(int *num, int n){
int times = 1;
for(int i = 0; i < n - 1 && times; i++){//将num[n]看作是已排序区,循环遍历n-1次;
times = 0;
for(int j = 0; j < n - i - 1; j++){//在num[n-i-1]之前找到最大的元素放入已排序区;
if(num[j] > num[j + 1]){
swap(num[j], num[j + 1]);
times++;//如果某轮没有进行交换操作,那就不用交换,退出循环;
}
}
}
return ;
}
void merge_sort(int *num, int l, int r){
if(l == r) return ;//如果待排序元素只有一个,直接返回;
int mid = (l + r) / 2;//递归分治,将一个数组划分成两个;
merge_sort(num, l, mid);//调用求每个区域的排序结果
merge_sort(num, mid + 1, r);
int *temp = (int *)malloc(sizeof(int) * (r - l + 1));//重新开辟新的存储空间用于存储数据;
int ind1 = l, ind2 = mid + 1, k = 0;//前一半区间的首地址;后一半区间的首地址;temp数组的首地址;
while(ind1 <= mid || ind2 <= r){//当俩个数组有一个不为空;
if(ind2 > r ||(ind1 <= mid &&(num[ind1] < num[ind2]))){//如果第二个数组为空,或者num[ind1]<num[ind2],把num[ind1]放入数组中;
temp[k] = num[ind1];
k++;
ind1++;
}else{
temp[k] = num[ind2];
k++;
ind2++;
}
}
memcpy(num + l, temp, sizeof(int) * (r - l + 1));//拷贝;
free(temp);//将temp数组清空;
return ;
}
#define TEST(n, func){ \
int *num = (int *)malloc(sizeof(int) * n); \
for(int i = 0; i < n; i++){ \
num[i] = rand() % 100; \
}\
func; \
printf("%s : ", #func); \
for(int i = 0; i < n; i++){ \
printf("%d ", num[i]); \
} \
printf("\n"); \
}
int main(){
srand(time(0));
TEST(20, insert_sort(num, 20));
TEST(20, bubble_sort(num, 20));
TEST(20, merge_sort(num, 0, 19));
return 0;
}
输出结果:
insert_sort(num, 20) : 99 99 98 93 92 83 79 79 73 71 66 49 48 31 26 26 9 8 8 5
bubble_sort(num, 20) : 3 14 17 36 39 40 42 63 65 69 75 78 81 83 85 85 89 91 92 96
merge_sort(num, 0, 19) : 4 4 12 17 19 20 25 35 38 42 43 47 48 55 60 62 75 89 96 96