排序算法
排序是编程中很重要的一种算法,虽然各编程语言都实现了效率很高的sort函数在工作中调用,但是经典排序算法里面的许多思想值得借鉴以及深入学习。
以下是自己对几个经典排序的实现。
用到的交换两数的宏定义,以及数组初始化,输出函数:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <time.h>
#include<windows.h>
#define SWAP(a,b) do { temp = (a);\
(a) = (b);\
(b) = (temp);}while(0);
//随机生成N个整数
void init_array(int a[],int n)
{
int i ;
srand((int)time(NULL));
for (i=0;i<n;i++) //随机生成 0 - 100
{
a[i] = rand()%100 ;
}
printf("随机生成了 %d 个整数 \n",n);
for (i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
//打印数组元素
void showArray(int a[],int n)
{
int i ;
printf("现在数组中的序列为:\n");
for (i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
冒泡排序
这是最简单的一种排序了,总结就是一句话,n个元素比较n-1趟,每趟比较n-1-i次。
具体代码:
//冒泡排序 (我个人习惯:n个元素比较n-1趟,每趟比较n-1-i次)
void sort_buble_AmyStyle(int a[],int size)
{
int i ,j;
for (i=0;i<size-1;i++)
for (j=0;j<size-1-i;j++)
{
if (a[j]>a[j+1])
{
SWAP(a[j],a[j+1]);
}
}
}
测试代码&运行截图:
选择排序
思想很简单,每次选择未排序序列中最小(最大)的元素即可。
具体实现代码:
//选择排序 每次选取最小值的位置,并记录最小值
void sort_select(int a[],int size)
{
int i ,j ,min_index ;
for (i=0;i<size;i++)
{
min_index = i;
for (j=i;j<size;j++)
{
if (a[min_index]>a[j])
min_index = j;
}
SWAP(a[i],a[min_index]);
}
//这是用了一个 min_value ,其实可以省略,只需要最小值的下标就够了
/*for (i=0;i<size;i++)
{
min_value = a[i];
min_index = i;
for (j=i;j<size;j++)
{
if (min_value>a[j])
{
min_index = j;
min_value=a[j];
}
}
SWAP(a[i],a[min_index]);
}*/
}
测试代码运行截图:
插入排序
算法导论中的描述十分精彩,扑克牌的排序就是插入排序。
具体实现代码(略有难度):
//插入排序 第一个元素默认有序,后面的元素依次往前插,插之前先往后移动
void sort_insert_myStyle(int a[],int size)
{
int i ,j;
int insert_value=a[0];
//数组第一个元素当做有序数列,从第二个元素开始依次往前比较,然后插入
for(i = 1;i<size;i++)
{
if (a[i-1] > a[i]) // (a[i]<a[i-1])
{
insert_value =a[i];
for (j = i-1;insert_value<a[j]&& j>=0;j--)//向后移动
{
a[j+1] = a[j];
}
a[j+1] = insert_value; //
}
}
}
测试代码&运行截图: