C语言笔记—冒泡排序

1.基础冒泡排序核心代码:

bool bubble(int* arr,int n){
	bool changed = false;//判断本趟冒泡是否交换数据
	for(int i=1;i<n;i++){
		if(arr[i]<arr[i-1]){
			int t = arr[i];
			arr[i] = arr[i-1];
			arr[i-1] = t;
			changed = true;
		}
	}
	return changed;
}
void bubble_sort(int* arr,int n){
	//时间复杂度O(n^2)
	//空间复杂度O(1)
	for(int i=0;i<n-1;i++){
		if(!bubble(arr,n-i)){
			break;
		}
	}
}

1.1测试代码:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>

//生成n个数据的随机数列[1,100]

int* createRandArray(int n){
	int* arr = malloc(n*sizeof(int));
	srand(time(NULL));
	for(int i=0;i<n;i++){
		arr[i]=rand()%100+1;
	}
	return arr;
}
// 打印数组
void printArray(int* arr,int n){
	for(int i=0;i<n;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
}
// 判度数组是否是非递减排序
bool isOrder(int* arr,int n){
	for(int i=1;i<n;i++){
		if(arr[i]>=arr[i-1]){
			continue;
		}else{
			return false;
		}
	}
	return true;
}
//冒泡排序==============================
bool bubble(int* arr,int n){
	bool changed = false;//判断本趟冒泡是否交换数据
	for(int i=1;i<n;i++){
		if(arr[i]<arr[i-1]){
			int t = arr[i];
			arr[i] = arr[i-1];
			arr[i-1] = t;
			changed = true;
		}
	}
	return changed;
}
void bubble_sort(int* arr,int n){
	//时间复杂度O(n^2)
	//空间复杂度O(1)
	for(int i=0;i<n-1;i++){
		if(!bubble(arr,n-i)){
			break;
		}
	}
}

int main(){
	int n;
	scanf("%d",&n);
	int* arr = createRandArray(n);
	printArray(arr,n);
	printf("Original is order?%s\n\n",isOrder(arr,n)?"yes":"no");
	
	bubble_sort(arr,n);
	printArray(arr,n);
	printf("Bubble is order?%s\n\n",isOrder(arr,n)?"yes":"no");
	
	free(arr);
	arr= NULL;
}

2.类型通用版冒泡排序核心代码:

void memswp(void* a,void* b,int size){
	unsigned char t[size];
	memcpy(t,a,size);
	memcpy(a,b,size);
	memcpy(b,t,size);
}


//升级版冒泡
typedef int(*cmp_t)(const void* a,const void* b);
bool bubble(void* arr,int n,int size,cmp_t cmp){
	bool changed = false;
	for(int i =1;i<n;i++){
		if(cmp(arr+i*size,arr+(i-1)*size)<0){
			unsigned char t[size];
	//		memcpy(t,arr+i*size,size);
	//		memcpy(arr+i*size,arr+(i-1)*size,size);
	//		memcpy(arr+(i-1)*size,t,size);      这些提取出去作为函数
			memswp(arr+i*size,arr+(i-1)*size,size);
			changed = true;
		}
	}
	return changed;
}
void bsort(void* arr,int n,int size,cmp_t cmp){
	for(int i=0;i<n-1;i++){
		if(!bubble(arr,n-i,size,cmp)){
			break;
		}
	}
}

2.1测试代码:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>

//生成n个数据的随机数列[1,100]

int* createRandArray(int n){
	int* arr = malloc(n*sizeof(int));
	srand(time(NULL));
	for(int i=0;i<n;i++){
		arr[i]=rand()%100+1;
	}
	return arr;
}
// 打印数组
void printArray(int* arr,int n){
	for(int i=0;i<n;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
}
// 判度数组是否是非递减排序
bool isOrder(int* arr,int n){
	for(int i=1;i<n;i++){
		if(arr[i]>=arr[i-1]){
			continue;
		}else{
			return false;
		}
	}
	return true;
}

void memswp(void* a,void* b,int size){
	unsigned char t[size];
	memcpy(t,a,size);
	memcpy(a,b,size);
	memcpy(b,t,size);
}


//升级版冒泡
typedef int(*cmp_t)(const void* a,const void* b);
bool bubble(void* arr,int n,int size,cmp_t cmp){
	bool changed = false;
	for(int i =1;i<n;i++){
		if(cmp(arr+i*size,arr+(i-1)*size)<0){
			unsigned char t[size];
	//		memcpy(t,arr+i*size,size);
	//		memcpy(arr+i*size,arr+(i-1)*size,size);
	//		memcpy(arr+(i-1)*size,t,size);		这些提取出去作为函数
			memswp(arr+i*size,arr+(i-1)*size,size);
			changed = true;
		}
	}
	return changed;
}
void bsort(void* arr,int n,int size,cmp_t cmp){
	for(int i=0;i<n-1;i++){
		if(!bubble(arr,n-i,size,cmp)){
			break;
		}
	}
}

int cmpint(const void* a,const void* b){
	return *(int*)a - *(int*)b;
}
int cmpchar(const void* a,const void* b){
	return *(char*)a - *(char*)b;

typedef struct{
	char name[10];
	int score;
} Test;

int cmpTest(const void* a,const void* b){
	return ((Test*)a)->score - ((Test*)b)->score;
}
int main(){
	int n;
	scanf("%d",&n);
	int* arr = createRandArray(n);
	printArray(arr,n);
	printf("Original is order?%s\n\n",isOrder(arr,n)?"yes":"no");

	bsort(arr,n,sizeof(int),cmpint);
	printArray(arr,n);
	printf("bsort is order?%s\n\n",isOrder(arr,n)?"yes":"no");

	char s[]="123azHello";
	bsort(s,strlen(s),sizeof(char),cmpchar);
	printf("%s\n",s);

	free(arr);
	arr= NULL;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值