C语言笔记—选择排序

1.基础选择排序核心代码:

int find_max_index(int* arr,int n){
	int max = arr[0];
	int max_index = 0;
	for(int i=1;i<n;i++){
		if(max<arr[i]){
			max = arr[i];
			max_index = i;
		}
	}
	return max_index;
}
void select_sort(int* arr,int n){
	//时间复杂度O(n^2)
	//空间复杂度O(1)
	for(int i=0;i<n-1;i++){
		int index = find_max_index(arr,n-i);
		//最大值与最后值交换
		if(index != n-i-1){
			int t = arr[index];
			arr[index] = arr[n-i-1];
			arr[n-i-1] = t;
		}
	}
}

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;
}
//选择排序=================================
int find_max_index(int* arr,int n){
	int max = arr[0];
	int max_index = 0;
	for(int i=1;i<n;i++){
		if(max<arr[i]){
			max = arr[i];
			max_index = i;
		}
	}
	return max_index;
}
void select_sort(int* arr,int n){
	//时间复杂度O(n^2)
	//空间复杂度O(1)
	for(int i=0;i<n-1;i++){
		int index = find_max_index(arr,n-i);
		//最大值与最后值交换
		if(index != n-i-1){
			int t = arr[index];
			arr[index] = arr[n-i-1];
			arr[n-i-1] = t;
		}
	}
}
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");
	
	select_sort(arr,n);
	printArray(arr,n);
	printf("Select is order?%s\n\n",isOrder(arr,n)?"yes":"no");

	free(arr);
	arr= NULL;

2.类型通用版选择排序核心代码:

int find_max_index(void* arr,int n,int size,cmp_t cmp){
	unsigned char max[size];
	memcpy(max,arr,size);
	int max_index = 0;
	for(int i=1;i<n;i++){
		if(cmp(max,arr+i*size)<0){
			memcpy(max,arr+i*size,size);
			max_index = i;
		}
	}
	return max_index;
}
void ssort(void* arr,int n,int size,cmp_t cmp){
	for(int i=0;i<n-1;i++){
		int index =find_max_index(arr,n-i,size,cmp);
		//最大值与最后值交换
		if(index!=n-i-1){
			memswp(arr+index*size,arr+(n-i-1)*size,size);
		}
	}
}

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


//升级版选择
int find_max_index(void* arr,int n,int size,cmp_t cmp){
	unsigned char max[size];
	memcpy(max,arr,size);
	int max_index = 0;
	for(int i=1;i<n;i++){
		if(cmp(max,arr+i*size)<0){
			memcpy(max,arr+i*size,size);
			max_index = i;
		}
	}
	return max_index;
}
void ssort(void* arr,int n,int size,cmp_t cmp){
	for(int i=0;i<n-1;i++){
		int index =find_max_index(arr,n-i,size,cmp);
		//最大值与最后值交换
		if(index!=n-i-1){
			memswp(arr+index*size,arr+(n-i-1)*size,size);
		}
	}
}

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");

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

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

	free(arr);
	arr= NULL;
}
发布了48 篇原创文章 · 获赞 5 · 访问量 2391

猜你喜欢

转载自blog.csdn.net/weixin_44718794/article/details/104145158
今日推荐