这周,主要看看排序,下面是比较实用的几种方法——插入排序、选择排序、冒泡排序和快速排序。
插入排序:
插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
在void insert_sort(int array[],unsignedint n)
{
int i,j;
int temp;
for(i = 1;i < n;i++)
{
temp = array[i];
for(j = i;j > 0&& array[j - 1] > temp;j--)
{
array[j]= array[j - 1];
}
array[j] = temp;
}
}
选择排序:
void select_sort(int *a,int n)
{
register int i,j,min,t;
for(i = 0;i < n-1;i++)
{
min = i;//查找最小值
for(j = i + 1;j < n;j++)
if(a[min] > a[j])
min = j;//交换
if(min != i)
{
t = a[min];
a[min] = a[i];
a[i] = t;
}
}
}
冒泡排序
重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
#include <stdio.h>
#define SIZE 8void bubble_sort(int a[], int n)
{
int i, j, temp;
for (j = 0;j < n - 1;j++)
for (i = 0;i < n - 1 - j;i++)
{
if(a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
int main()
{
int number[SIZE] = {95, 45, 15, 78, 84, 51, 24, 12};
int i;
bubble_sort(number, SIZE);
for (i = 0; i < SIZE; i++)
{
printf("%d", number[i]);
}
printf("\n");
}
快速排序:
在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
void Qsort(int a[], int low, int high)
{
if(low >= high)
{
return;
}
int first = low;
int last = high;
int key = a[first];/*用字表的第一个记录作为枢轴*/
while(first < last)
{
while(first < last && a[last] >= key)
{
--last;
}
a[first] = a[last];/*将比第一个小的移到低端*/
while(first < last && a[first] <= key)
{
++first;
}
a[last] = a[first];
/*将比第一个大的移到高端*/
}
a[first] = key;/*枢轴记录到位*/
Qsort(a, low, first-1);
Qsort(a, first+1, high);
}