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;
}

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;
}
发布了43 篇原创文章 · 获赞 4 · 访问量 1036
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览