几种常见的排序
实际开发中,我们最常见到最常使用的排序莫过于:冒泡排序、选择排序、插入排序和希尔排序。希尔排序其实就是一种特殊的插入排序。
#ifndef ALGORITHM_H
#define ALGORITHM_H
#define ARRAR_SIZEOF(a) ( sizeof((a)) / sizeof((a[0])) )
/**
* 直接选择排序
* @param arr 数组指针
* @param size 数组大小
*/
void select_sort(int arr[], int size)
{
int i,j,min,tmp;
for(i = 0; (i < size -1) && flag; i ++)
{
min = i;
for(j = i + 1; j < size; j++)
{
if(arr[min] > arr[j])
{
min = j;
}
}
/* 当最小值的下标min与i不相等时才需要交换位置,否则i位置就是最小的 */
if( i != min)
{
tmp = arr[min];
arr[min] = arr[i];
arr[i] = tmp;
}
}
}
/**
* 冒泡排序
* @param arr 数组指针
* @param size 数组大小
*/
void bubble_sort(int arr[], int size)
{
int i,j,tmp,flag = 1;
for(i = 0; (i < size - 1) && flag; i++ )
{
flag = 0;
for(j = 0;j < size - 1 - i; j++)
{
if(arr[j] > arr[j + 1])
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 1;
}
}
}
}
/**
* 直接插入排序
* @param arr
* @param size
*/
void insert_sort(int arr[], int size)
{
int i,j,tmp;
for(i = 1; i < size; i++)
{
tmp = arr[i];
for(j = i - 1;j >= 0;j--)
{
if(tmp > arr[j])
break;
arr[j + 1] = arr[j];
}
arr[j + 1] = tmp;
}
}
/**
* 希尔排序
* @param arr
* @param size
*/
void shell_sort(int arr[], int size)
{
int i,j,tmp,gap = size;
do
{
gap = gap / 3 + 1;
for(i = gap; i < size; i += gap)
{
tmp = arr[i];
for(j = i - gap;j >= 0;j -= gap)
{
if(tmp > arr[j])
break;
arr[j + gap] = arr[j];
}
arr[j + gap] = tmp;
}
}
while(gap > 1);
}
#endif // ALGORITHM