当前位置:网站首页>Code implementation of general bubbling, selection, insertion, hill and quick sorting
Code implementation of general bubbling, selection, insertion, hill and quick sorting
2022-04-23 10:48:00 【A dazed caddie】
General purpose bubbling 、 choice 、 Insert 、 hill 、 Quick sort code implementation
/************************************************************************* > File Name: sort.c > Author: xxx > Mail: xxx.com > Created Time: ************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stddef.h>
//#define quicksort
#define shellsort
//#define insertsort
//#define selectsort
//#define bubblesort
#define N 8
struct T {
int a;
float d;
};
void print_arr(float * arr,size_t size);
void print_str(char ** arr,size_t size);
void print_struct(struct T * s,size_t size);
int cmpstr(const void * a,const void * b);
int cmpfun(const void * a,const void * b);
void swap(void * para1,void * para2,size_t size);
void bubble_sort(void * base,size_t nitems,size_t size,int (*compar)(const void*, const void*));
void select_sort(void * base,size_t nitems,size_t size,int (*compar)(const void*, const void*));
void insert_sort(void * base,size_t nitems,size_t size,int (*compar)(const void*, const void*));
void shell_sort(void * base,size_t nitems,size_t size,int (*compar)(const void*, const void*));
static int quick_sort_recursive(void *arr,int first,int end,size_t size,int (*compar)(const void*, const void*));
int quick_sort(void * base,size_t nitems,size_t size,int (*compar)(const void*, const void*));
float values[] = {
22.7,12.5,51.8,51.3,2,90.9,33,67};
char * straa[] = {
"zhangsan","lisi","wangerma","xiaoming","baijuyi","anji","pita","nini"};
struct T strudata[] = {
{
51,51.3},
{
23,23.4},
{
89,89.6},
{
100,100.1},
{
55,55.7},
{
67,67.08},
{
45,45.7},
{
11,11.9}
};
//print_arr
void print_arr(float * arr,size_t size)
{
int i;
for( i = 0; i < size; i++)
{
printf("%-4.1f ",arr[i]);
}
printf("\n");
}
//print_str
void print_str(char ** arr,size_t size)
{
int i;
for( i = 0; i < size; i++)
{
printf("%s\n",*(arr + i));
}
}
//print_struct
void print_struct(struct T * s,size_t size)
{
int i;
for( i = 0; i < size; i++)
{
printf("%d: %.1f\n",s[i].a,s[i].d);
}
}
//compare
int cmpfun(const void * a,const void * b)
{
const float *aa = (float *)a;
const float *bb = (float *)b;
return (*aa > *bb) - (*aa < *bb);
}
//compare_string
int cmpstr(const void * a,const void * b)
{
char **pt1 = (char **)a;
char **pt2 = (char **)b;
return strcmp(*pt1,*pt2);
}
int cmpT_by_d(const void * a,const void * b)
{
struct T * pt1 = (struct T *) a;
struct T * pt2 = (struct T *) b;
return (pt1->d > pt2->d) - (pt1->d < pt2->d);
}
//swap memory
void swap(void * para1,void * para2,size_t size)
{
char buff[size];
char *a = (char *)para1;
char *b = (char *)para2;
memcpy(buff,a,size);
memcpy(a,b,size);
memcpy(b,buff,size);
}
//bubble_sort
void bubble_sort(void * base,size_t nitems,size_t size,int (*compar)(const void*, const void*))
{
int i,j;
char *basetemp = (char *)base;
char buff[size];
for(i = 0 ; i < nitems -1; i++)
{
for(j = 0; j <nitems - i -1;j++ )
{
if(compar((basetemp + (j*size)),(basetemp + (j + 1)*size)) > 0)
{
memcpy(buff,basetemp + (j*size),size);
memcpy(basetemp + (j*size),basetemp + (j + 1)*size,size);
memcpy(basetemp + (j + 1)*size,buff,size);
}
}
}
}
//select_sort
void select_sort(void * base,size_t nitems,size_t size,int (*compar)(const void*, const void*))
{
int i,j,min;
char *basetemp = (char *)base;
//printf("%p %p\n",base + 1,base + 2);
for(i = 0; i < nitems - 1;i++)
{
min = i;
for(j = i + 1; j < nitems;j++ )
{
//printf("%d \n",(*cmpfun)((base1 + (min*size)),(base1 + (j*size))));
if(compar(basetemp + min*size,basetemp + j*size) > 0)
{
min = j;
}
}
//printf("%d %d\n",min,i);
if( min != i)
{
swap(basetemp + min*size,basetemp + i*size,size);
}
}
}
//insert_sort
void insert_sort(void * base,size_t nitems,size_t size,int (*compar)(const void*, const void*))
{
int i,j;
char buff[size];
char *basetemp = (char*)base;
for(i = 1; i < nitems;i++)
{
if(compar(basetemp + (i - 1)*size,basetemp + i*size) > 0 )
{
memcpy(buff,basetemp + i * size,size);
for(j = i -1; (j >= 0) && compar(basetemp + j * size,buff) > 0;j--)
{
// printf("%d\n",j);
memcpy(basetemp + (j + 1)*size,basetemp + j*size,size);
}
//printf("--------\n");
memcpy(basetemp + (j + 1)*size,buff,size);
}
}
}
//shell_sort
void shell_sort(void * base,size_t nitems,size_t size,int (*compar)(const void*, const void*))
{
int i,j,inc;
char buff[size];
char *basetemp = (char *)base;
for(inc = nitems >> 1; inc >= 1;inc >>= 1)
{
for(i = inc; i < nitems; i ++)
{
if(compar(basetemp + (i - inc)*size,basetemp + i*size) > 0 )
{
memcpy(buff,basetemp + i * size,size);
for(j = i - inc; (j >= 0) && compar(basetemp + j * size,buff) > 0;j -= inc)
{
memcpy(basetemp + (j + inc)*size,basetemp + j*size,size);
}
memcpy(basetemp + (j + inc)*size,buff,size);
}
}
// printf("increment:%d\n",inc);
// print_arr(values,N);
}
}
//quick_sort_recursive
static int quick_sort_recursive(void *arr,int first,int end,size_t size,int (*compar)(const void*, const void*))
{
int i = first;
int j = end;
int pivot;
char * arrtemp = (char *)arr;
while( i < j)
{
while( i < j && (compar(arrtemp + j*size,arrtemp + i*size) >= 0))
j--;
if( i < j)
{
swap(arrtemp + i*size,arrtemp + j*size,size);
i++;
}
while( i < j && (compar(arrtemp + j*size,arrtemp + i*size) >= 0))
i++;
if(i < j)
{
swap(arrtemp + i*size,arrtemp + j*size,size);
j--;
}
}
pivot = i;
if(first < end)
{
quick_sort_recursive(arrtemp,first,pivot-1,size,compar);
quick_sort_recursive(arrtemp,pivot+1,end,size,compar);
}
return 0;
}
//quick_sort
int quick_sort(void * base,size_t nitems,size_t size,int (*compar)(const void*, const void*))
{
quick_sort_recursive(base,0,nitems-1,size,compar);
return 0;
}
//main
int main(int argc, const char *argv[])
{
printf(" Before ordering :\n");
print_arr(values,N);
print_str(straa,N);
print_struct(strudata,N);
printf("------------------------------------------\n");
#ifdef quicksort
quick_sort(values,N,sizeof(float),cmpfun);
quick_sort(straa,N,sizeof(char *),cmpstr);
quick_sort(strudata,N,sizeof(struct T),cmpT_by_d);
#endif
#ifdef shellsort
shell_sort(values,N,sizeof(float),cmpfun);
shell_sort(straa,N,sizeof(char *),cmpstr);
shell_sort(strudata,N,sizeof(struct T),cmpT_by_d);
#endif
#ifdef insertsort
insert_sort(values,N,sizeof(float),cmpfun);
insert_sort(straa,N,sizeof(char *),cmpstr);
insert_sort(strudata,N,sizeof(struct T),cmpT_by_d);
#endif
#ifdef selectsort
select_sort(values,N,sizeof(float),cmpfun);
select_sort(straa,N,sizeof(char *),cmpstr);
select_sort(strudata,N,sizeof(struct T),cmpT_by_d);
#endif
#ifdef bubblesort
bubble_sort(values,N,sizeof(float),cmpfun);
bubble_sort(straa,N,sizeof(char *),cmpstr);
bubble_sort(strudata,N,sizeof(struct T),cmpT_by_d);
#endif
printf(" After ordering :\n");
print_arr(values,N);
print_str(straa,N);
print_struct(strudata,N);
}
版权声明
本文为[A dazed caddie]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204230618291069.html
边栏推荐
- Sim Api User Guide(5)
- 203. Remove linked list elements (linked list)
- 微信小程序中app.js文件、组件、api
- 基于PyQt5实现弹出任务进度条功能示例
- 19. Delete the penultimate node of the linked list (linked list)
- Diary of dishes | Blue Bridge Cup - hexadecimal to octal (hand torn version) with hexadecimal conversion notes
- JVM - common parameters
- 全栈交叉编译X86完成过程经验分享
- 使用zerotier让异地设备组局域网
- 部署jar包
猜你喜欢
[provincial election joint examination 2022 d2t1] card (state compression DP, FWT convolution)
MapReduce core and foundation demo
How does the swagger2 interface import postman
Idea - indexing or scanning files to index every time you start
Cve-2019-0708 vulnerability exploitation of secondary vocational network security 2022 national competition
C language - custom type
解决方案架构师的小锦囊 - 架构图的 5 种类型
中职网络安全2022国赛之CVE-2019-0708漏洞利用
Yarn core parameter configuration
基于PyQt5实现弹出任务进度条功能示例
随机推荐
The difference between restful and soap
Jinglianwen technology - professional data annotation company and intelligent data annotation platform
一个微博数据库设计带来的简单思考
How to quickly download vscode
Reading integrity monitoring techniques for vision navigation systems - 5 Results
微信小程序中app.js文件、组件、api
SQLServer 查询数据库死锁
Sim Api User Guide(7)
Differences among restful, soap, RPC, SOA and microservices
C语言——自定义类型
【leetcode】107.二叉树的层序遍历II
Initial exploration of NVIDIA's latest 3D reconstruction technology instant NGP
/etc/shadow可以破解吗?
JVM——》常用参数
Introduction to data analysis 𞓜 kaggle Titanic mission (IV) - > data cleaning and feature processing
Charles 功能介绍和使用教程
The courses bought at a high price are open! PHPer data sharing
【leetcode】102. Sequence traversal of binary tree
【省选联考 2022 D2T1】卡牌(状态压缩 DP,FWT卷积)
最强日期正则表达式