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