数据结构 排序 稳定排序

稳定排序:插入排序、冒泡排序、归并排序

如果有两个数字的数值大小相同,排序后的相对顺序为被改变。

一.插入排序

时间复杂度: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 

猜你喜欢

转载自blog.csdn.net/qq_38362049/article/details/81067518
今日推荐