/*
简单排序
1 冒泡排序 两两交换位置(相交选择排序成本有点大) 稳定
2 选择排序 选择最值记住下标到最后交换位置 不稳定
3 插入排序 排好序列 待排序列 依次从待排序列取数,插入到排好的序列 稳定
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
#define Element int
void BubbleSort(Element arr[],int lenght, int order, int printfInfo) ;
void SelectSort(Element arr[], int lenght, int order, int printfInfo) ;
void InsertSort(Element arr[], int lenght, int order, int printInfo);
void Change(Element *a, Element *b);
Element* ProduceRandom(int count,int lenght);
void Traversal(Element arr [], int lenght);
//冒泡排序
void BubbleSort(Element arr[],int lenght, int order, int printfInfo)
{
int i;
int j;
int count = 0;
int isChanged = 0;
for(i = 0; i < lenght - 1; i ++)
{
isChanged = 0;
for(j = 0; j < lenght - 1 - i; j ++)
{
if(printfInfo)
{
count ++;
printf("[冒泡排序] <%3d>", count);
printf(" i = %d 下标[%d,%d]",i, j, j + 1);
}
if(order ? arr[j] > arr[j + 1] : arr[j] < arr[j + 1])
{
if(printfInfo)
printf(" 交换数值[%d, %d]",arr[j],arr[j + 1]);
isChanged = 1;
Change(&arr[j], &arr[j + 1]);
}
if(printfInfo)
printf("\n");
}
if(!isChanged)
{
if(printfInfo)
printf("[冒泡排序] 未交换数值,顺序已排好\n");
break;
}
if(printfInfo)
printf("\n");
}
}
//选择排序
void SelectSort(Element arr[], int lenght, int order, int printfInfo)
{
int i;
int j;
int index;
int count = 0;
for(i = 0; i < lenght - 1; i ++)
{
index = 0;
if(printfInfo)
printf("\n");
for(j = 1; j < lenght - i; j ++)
{
if(printfInfo)
{
count ++;
printf("[选择排序] <%3d>", count);
printf(" i = %d 下标[%d,%d] 数值[%d, %d]",i, index, j, arr[index], arr[j]);
}
if(order ? arr[index] < arr[j] :arr[index] > arr[j])
{
if(printfInfo)
printf(" 标记下标");
index = j;
}
if(printfInfo)
printf("\n");
}
if(index != lenght - 1 - i)
{
if(printfInfo)
printf("[选择排序] 交换数值 下标[%d,%d] 数值[%d, %d]\n",lenght - 1 - i,index,arr[lenght - 1 - i],arr[index]);
Change(&arr[lenght - 1 - i], &arr[index]);
}
}
}
//插入排序
void InsertSort(Element arr[], int lenght, int order, int printInfo)
{
int i;
int j;
Element temp;
for(i = 1; i < lenght; i++)
{
temp = arr[i];
for(j = i - 1; j >= 0; j--)
{
if(arr[j] > temp)
{
Change(&arr[j], &arr[j + 1]);
}
else
{
arr[j + 1] = temp;
break;
}
}
}
}
//交换两数
void Change(Element *a, Element *b)
{
Element temp = *a;
*a = *b;
*b = temp;
}
//产生随机数
Element* ProduceRandom(int count,int lenght)
{
int i ;
Element * arr = (Element*)malloc(sizeof(Element) * count);
srand(time(NULL));
for(i = 0; i < count; i++)
{
arr[i] = rand()%(10 * lenght);
}
return arr;
}
//遍历
void Traversal(Element arr [], int lenght)
{
int i;
printf("\n");
for(i = 0; i < lenght; i++)
{
printf("[遍历] <%3d>%7d\n",i + 1, arr[i]);
}
printf("\n");
}
简单排序(冒泡排序、选择排序、插入排序)
最新推荐文章于 2024-04-23 23:57:04 发布