#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
//#include"linkList.h"
//一般冒泡排序
void BubbleSort(int * arr, int len)
{
for (int i = 0; i < len-1; i++)//len-1 因为两两比较少一次
{
for (int j = 0; j < len-i-1; j++)
{
if (arr[j] < arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < len; i++)
{
printf("逆序数组:%d\n", arr[i]);
}
}
//下标排序
void Subscript_BubbleSort(int * arr, int len)
{
for (int i = 0; i < len; i++)
{
int min = i;
for (int j = i+1; j < len; j++)
{
if (arr[i] < arr[j])
min = j;
}
if (min != i)
{
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
for (int i = 0; i < len; i++)
{
printf("SubscriptBublleSort:%d\n", arr[i]);
}
}
//回调函数自己的数据类型 由用户判断的数据类型确定
int myCompare(void* data1, void* data2)
{
//int* num1 = (int*)data1;
//int* num2 = (int*)data2;
char * char1 = data1;
char * char2 = data2;
if (*char1 > *char2)
return 1;
else
return 0;
}
//任意数据类型排序
void selectSort(void * arr, int eleSize, int len, int(*myCompare)(void *, void *))//
{
char * temp = malloc(eleSize);//放这 每次循环直接复用 可提高效率
for (int i = 0; i < len; i++)
{
int MinOrMax = i;
for (int j = i+1; j < len; j++)
{
char *pJ = (char*)arr + j * eleSize;
char *pMinOrMax = (char*)arr + MinOrMax * eleSize;
if (myCompare(pJ, pMinOrMax))//myCompare(pJ,pMinOrMax)
{
MinOrMax = j;
}
}
if (i != MinOrMax)
{
//交换数据
char * pI = (char *)arr + i * eleSize;
char * pMinOrMax = (char *)arr + MinOrMax * eleSize;
memcpy(temp, pI, eleSize);
memcpy(pI, pMinOrMax, eleSize);
memcpy(pMinOrMax, temp, eleSize);
}
}
if (temp != NULL)
{
free(temp);
temp = NULL;
}
}
struct Person
{
char name[64];
int age;
};
struct Person pArray[] =
{
{"aaa",10},
{"bbb",20},
{"ccc",30},
{"ddd",40},
{"eee",50},
};
int SmyCompare(void * data1, void * data2)
{
struct Person * per1 = data1;
struct Person * per2 = data2;
return per1->age > per2->age;
}
int arr[] = { 1,2,3,4,5,6 };
char LetterArr[] = { 'a','b','c','d','e' };
void main()
{
//一般冒泡排序
//BubbleSort(arr, sizeof(arr)/sizeof(int));
//下标比较数据交换排序
//Subscript_BubbleSort(arr, sizeof(arr) / sizeof(int));
//任意类型数据排序
selectSort((void*)LetterArr, sizeof(char), sizeof(LetterArr) / sizeof(char),myCompare);
for (int i = 0; i < 5; i++)
{
printf("字符排序输出%c\n", LetterArr[i]);
}
//结构类型数据
selectSort(pArray, sizeof(struct Person), sizeof(pArray) / sizeof(struct Person), SmyCompare);
for (int i = 0; i < 5; i++)
{
printf("结构类型数据:%s\t%d\n", pArray[i].name, pArray[i].age);
}
system("pause");
}