本篇文章分别介绍三种排序方法,冒泡排序,插入排序,快速排序。
为了便于提高效率与阅读,借助rand()函数随机分配整数初始化与赋值给数组。
具体实现原理与过程请看代码,带有详细的注释,谢谢。
#include<stdio.h>
#include<stdlib.h>
// 公共函数
void PrintArray(int *pArray);
void CreateUnordered(int *pArray);
// 冒泡排序
void BubbleRank(int *pArray);
void CreateBubble(int *pArray);
// 快速排序
void CreateQucikRank(int *pArray);
void QuickRank(int *pArray, int Low, int High);
int FindPos(int *pArray, int Low, int High);
// 插入排序
void InsertRank(int *pArray);
void CreateInsertRank(int *pArray);
#define ArrayNum 10
int main()
{
int Array[ArrayNum] = {0};
// 创建冒泡排序
CreateBubble(Array);
// 创建快速排序
CreateQucikRank(Array);
// 创建插入排序
CreateInsertRank(Array);
while(1);
}
/*------------------------公共函数----------------------------*/
/*
函数名:CreateUnordered给数组元素变成无序
原理:通过时间来生成数据,为了便于观察,我们生成两位数的正数
*/
void CreateUnordered(int *pArray)
{
int i = 0;
int Temp = 0;
while(i < ArrayNum)
{
Temp = rand();
if(Temp < 100 && Temp > 9)
pArray[i++] = Temp;
}
printf("无序数组元素:");
for(i=0; i<ArrayNum; i++)
{
printf("%d ",pArray[i]);
}
printf("\n");
}
/*
函数名:PrintArray打印数组元素
原理:通过while循环打印数组用的元素
*/
void PrintArray(int *pArray)
{
int i = 0;
for(i=0; i<ArrayNum; i++)
{
printf("%d ",pArray[i]);
}
printf("\n\n");
}
/*------------------------冒泡排序----------------------------*/
void CreateBubble(int *pArray)
{
// 根据时间生成一个无序数组
CreateUnordered(pArray);
// 调用冒泡排序函数
BubbleRank(pArray);
// 打印数组元素
printf("After BubbleRank is:");
PrintArray(pArray);
}
/*
函数名:BubbleRank冒泡排序
原理:相邻的两个数相互比较,把较大的数放后面,用两个循环实现
*/
void BubbleRank(int *pArray)
{
int i = 0, j = 0;
int Temp = 0;
for(i=0; i<ArrayNum-1; i++)
{
for(j=0; j<ArrayNum-i-1; j++)
{
if(pArray[j] < pArray[j+1])
{
Temp = pArray[j];
pArray[j] = pArray[j+1];
pArray[j+1] = Temp;
}
}
}
}
/*------------------------快速排序----------------------------*/
/*
函数名:CreateQucikRank创建一个快速排序模块
原理:由三部分组成:生成无序元素数组,调用快速排序,打印排序结果
*/
void CreateQucikRank(int *pArray)
{
// 给数组无序排序
CreateUnordered(pArray);
// 快速排序
QuickRank(pArray, 0, ArrayNum-1);
// 打印排序之后的数组
printf("After QuickRank is:");
PrintArray(pArray);
}
/*
函数名:QucikRank快速排序
原理:通过递归调用FindPos
*/
void QuickRank(int *pArry, int Low, int High)
{
if(Low > High)
return;
int Pos = FindPos(pArry, Low, High);
QuickRank(pArry, Low, Pos-1);
QuickRank(pArry, Pos+1, High);
}
/*
函数名:FindPos
原理:把小于Temp的值放左边,大于Temp的值放右边
*/
int FindPos(int *pArray, int Low, int High)
{
int Temp = pArray[Low];
while(Low < High)
{
// 小于Temp的值放在左边
while(Low < High && pArray[High] >= Temp)
High--;
pArray[Low] = pArray[High]; // 把pArray[High]的值放到左边
// 大于Temp的值放在右边
while(Low < High && pArray[Low] <= Temp)
Low++;
pArray[High] = pArray[Low]; // 把pArray[Low]的值放到右边
}
pArray[Low] = Temp;
return Low;
}
/*------------------------插入排序----------------------------*/
/*
函数名:CreateInsertRank创建插入排序函数
原理:由三部分组成
*/
void CreateInsertRank(int *pArray)
{
// 给数组无序排序
CreateUnordered(pArray);
// 调用插入排序
InsertRank(pArray);
// 打印数组元素
printf("After InsertRank is:");
PrintArray(pArray);
}
/*
函数名:InsertRank插入排序函数
原理:从第二个元素开始与前一个元素比较,较小的放前面,重复此过程
*/
void InsertRank(int *pArray)
{
int i = 0;
int j = 0;
for(i=1; i<ArrayNum; i++)
{
j = i-1;
int Temp = pArray[i]; // 获取插入数据
while(pArray[j] > Temp && j>= 0)
{
pArray[j+1] = pArray[j];
j--;
}
pArray[++j] = Temp; // 插入到指定的位置
}
}
输出结果为: