给定arr如图所示 10个元素 要求按照从小到大进行排序
排序 思路 前后比较 若前面小于后面 则满足顺序排列,否则 则交换顺序
从此图可看出来 判断的关键在于 两点
if (arr[i] > arr[i + 1])
{
int tmp = arr[i];
arr[i ] = arr[i+1];
arr[i + 1] = tmp;
}
经过次if语句则可交换前后
那需要交换多少次呢 ? 有多少元素需要交换呢?
需要交换的肯定是全体数组,那交换多少次呢 ,当然前面交换的我们就不用在交换了 所以 就是 交换的次数在减去已经交换过的元素个数
冒泡排序本质: 冒泡排序顺序排序本质就是将 最大的换到最后面 每次排序送到后面去一个 那最后那一个就不需要换 排一次 最后的元素对一个 对应的也就少拍一次。
int main()
{
int arr[] = { 1,22,67,89,45,67,34,56,78,2 };
int i = 0;
for (i = 0; i < 10 - 1; i++)
{
for (int j = 0; j < 10 - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
for (i = 0; i < 10 ;i++)
{
printf("%d ", arr[i]);
}
return 0;
}
冒泡排序 看是在比较 实际上在将大数后移。
#include
#include
#include
int _Int(const void* p, const void* r)
{
return (*(int*)p - *(int*)r);
}
int _Char(const void* p, const void* r)
{
return (*(char*)p -*(char*)r);
}
int main()
{
int arr[] = { 1,3,4,5,32,1,2,22,345,987 };
char arr2[] = "afedpo";
qsort(arr2, (sizeof(arr2) / sizeof(arr2[0])),
sizeof(arr2[0]),
&_Char);
for (int i = 0; i < 6; i++)
{
printf("%c", arr2[i]);
}
return 0;
}
Qsort 模拟实现 使用 冒泡排序法
冒泡排序的本质是 左右相邻元素比较 将最大的换到最后面
冒泡排序的核心就是if( )判断语句的书写
整形数组判断是
` if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
`
使用Qsort则使用我们的自己函数传参完成
重点判断是
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width))
{
}
char的步长是1 加上需要跳过的 j元素个数 *每个元素大小 刚好跳到
#define _CRT_SECURE_NO_WARNINGS
#include
int _Int(const void* p, const void* r)
{
return *(char*)p - *(char*)r;
}
void _swap(char* buf1,char *buf2,int size)
{
int i = 0;
for (i=0;i<size;i++)
{
char a = *(buf1+i);
*(buf1 + i) = *(buf2 + i);
*(buf2 + i) = a;
}
}
void My_qsot(void* base,
size_t num,
size_t width,
int(*com)(const void*p, const void*r))
{
size_t i = 0;
size_t j = 0;
for (i = 0; i < num; i++)
{
for (j = 0; j < num - i - 1; j++)
{
if (com((char*)base + j * width,
(char*)base + (j + 1) * width)>0)
{
_swap((char*)base + j * width,
(char*)base + (j + 1) * width, width);
}
}
}
}
int main()
{
int arr[] = { 2,3,1,4,6,9,81,12,11,10 };
size_t sz = sizeof(arr) / sizeof(arr[0]);
My_qsot(arr,sz,sizeof(arr[0]),&_Int);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}