一、按照qorst函数的原理实现不同类型的数组的排序
。
qorst函数是库函数,可以实现快速排序。
在MSDN下类型为
void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );头文件是stdilb.h。
该函数的参数主要包括四个部分:
1、 代排序数组的首地址,2.元素的个数,3、元素的大小,4、指向函数的指针。
功能:
对
buf
指向的数据(包含
num
项,每项的大小为
size
)进行快速排序。如果函数
compare
的第一个参数小于第二个参数,返回负值;如果等于返回零值;如果大于返回正值。函数对
buf
指向的数据按升序排序。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void show(int *arr, int size)
{
assert(arr);
assert(size > 0);
int i = 0;
for (; i < size; i++)
{
printf(" %d ", arr[i]);
}
printf("\n");
}
//整形类型
int Intcmp(const void *x, const void *y)
{
return *(int*)x> *(int *)y ? -1 : *(int*)x< *(int *)y ? -1 : 0;
}
int In_sort(int *arr, int size)
{
assert(arr);
assert(size > 0);
qsort(arr, size, sizeof(arr[0]), Intcmp);
}
//字符串类型
int Strcmp(const void *x,const void *y)
{
return strcmp(*(char**)x, *(char**)y);
}
int str_Sort(char *msg[],int len)
{
assert(msg);
assert(len > 0);
qsort(msg, len, sizeof(msg[0]), Strcmp);
}
int main()
{
int *arr[] = { 1, 5, 7, 9, 4, 12 };
int size = sizeof(arr) / sizeof(arr[0]);
show(arr, size);
In_sort(arr, size);
char *msg[] = { "aaa", "ccc", "ddd", "bbb" };
int len = sizeof(msg) / sizeof(msg[0]);
str_Sort(msg, len);
int j = 0;
for (; j < len; j++)
{
printf(" %s ", msg[j]);
}
printf("\n");
system("pause");
return 0;
}
冒泡排序的原理:就是往上走的意思。通过两层for循环实现
1、外层的循环主要是控制次数,总次数是len-1;
2、外层主要是比较,将次大或者次小的排在最大或者最小的后面。
二、冒泡排序:
方法一:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void *swap(int*a, int*b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
void bubble_sort(int arr[], int len)
{
assert(arr);
assert(len > 0);//躺数
int i = 0;
for (; i < len - 1; i++)//冒泡的次数
{
int j = 0;
for (; j < len - 1 - i; j++)//交换;
{
if (arr[j]>arr[j + 1])
swap(&arr[j], &arr[j + 1]);
}
}
}
int main()
{
int arr[] = { 2, 4, 8, 6, 3, 7, 9 };
int len = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, len);
int i = 0;
for (; i < len; i++)
{
printf(" %d ", arr[i]);
}
system("pause");
return 0;
}
方法二、交换两个数之前判断两个数是否有序;如果已经排好序,不需要进行连个数的交换。可以flag标签来实现。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void *swap(int*a, int*b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
void bubble_sort(int *arr, int len)
{
assert(arr);
assert(len > 0);//躺数
int i = 0;
for (; i < len - 1; i++)//冒泡的次数
{
int j = 0;
int flag = 0;
for (; j < len - 1 - i; j++)//交换;
{
if (arr[j]>arr[j + 1])
swap(&arr[j], &arr[j + 1]);
flag = 1;
}
if (flag == 0)
{
break;
}
}
}
int main()
{
int *arr[] = { 2, 4, 8, 6, 3, 7, 9 };
int len = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, len);
int i = 0;
for (; i < len; i++)
{
printf(" %d ", arr[i]);
}
system("pause");
return 0;
}
方法三、实现任意类型的冒泡排序;主要原理和qorst函数类似:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
void show(int arr[], int len)
{
assert(arr);
assert(len > 0);
int i = 0;
for (; i < len; i++)
{
printf(" %d ", arr[i]);
}
printf("\n");
}
//整形数组
int intCmp(const void *x, const void *y)
{
return *(int*)x> *(int *)y ? 1 : *(int*)x< *(int *)y ? -1 : 0;
}
//字符串数组
int Strcmp(const void *x, const void *y)
{
return strcmp(*(char**)x, *(char**)y);
}
//交换两个数
void swap(void *num1,void *num2,size_t width)
{
int i = 0;
for (; i<(int)width; i++)
{
char tmp = (*(char *)num1+i);
*((char *)num1 + i) = *((char *)num2 + i);
*((char *)num1 + i )= *((char *)num2 + i);
}
}
void bubble_Sort(void *arr, int len ,int size,int (*cmp)(const void *,const void *))
{
assert(arr);
assert(len>0);
int i = 0;
for (; i < len - 1; i++)
{
int j = 0;
int flag = 0;
for (j = i; j < len - i - 1; j++)
{
if (cmp((char *)arr + j*size, (char *)arr + (j + 1)*size) > 0)
{
swap((char *)arr + j*size, (char *)arr + (j + 1)*size, size);
}
}
if (flag == 0)//判断是否为排序好的书数;
break;
}
}
int main()
{
int arr[] = { 1, 5, 8, 6, 3, 4, 7, 12, 753 };
int len = sizeof(arr) / sizeof(arr[0]);
bubble_Sort(arr, len,sizeof(arr[0]),intCmp);
show(arr, len);
char *msg[] = { "aaa", "ccc", "ddd", "bbb" };
int len1 = sizeof(msg) / sizeof(msg[0]);
bubble_Sort(msg, len1, sizeof(msg[0]), Strcmp);
int j = 0;
for (; j < len1; j++)
{
printf(" %s ", msg[j]);
}
printf("\n");
system("pause");
return 0;
}