算法一:冒泡排序
冒泡排序的基本思想:每次比较两个相邻的元素,如果他们顺序错误把他们交换。
算法步骤
1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3)针对所有的元素重复以上的步骤,除了最后一个。
4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
void bubble_sort(int num[], int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (num[j] > num[j + 1])
{
int temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
}
}
算法二:快速排序
算法步骤
(1)以集合第一个元素为基准,进行划分,将小与它的元素放在它左边,将大于它的元素放在它右边
(2)将左边元素的区间、右边元素的区间递归进行划分
(3)重复(1)(2),直至子区间不能再划分为止
实现代码
void QuickSort(int a[], int left, int right)
{
if (left >= right) return;
//以第一个元素为基准,执行一趟划分
int i = left, j = right;
int t = a[left];
while (i < j)
{
while (i < j && a[j] >= t) //从右向左扫描,选取第一个小于t的元素交换
j--;
a[i] = a[j];
while (i < j && a[i] <= t) //再从左往右扫描,选取第一个大于t的元素交换
i++;
a[j] = a[i];
}
a[i] = t;
//递归执行划分
QuickSort(a, left, i - 1);
QuickSort(a, i + 1, right);
}
算法三:直接插入排序
基本思想:将排序区间分成有序区和无序区两个区间,每次选取无序区的第一个元素插入到有序区
算法步骤:
(1)选取无序区中第一个元素i
(2)将i与有序区中元素j(0 <= j <= i-1)比较,寻找插入位置,同时移动元素
(3)将该元素插入合适位置
(4)重复(1)(2)(3)直至无序区长度为0
void InsertSort(int a[], int n)
{
for (int i = 1; i < n; i++) //每次选取无序区间的第一个元素插入
{
int t = a[i];
int j = i - 1; //i - 1即为有序区最后一个元素
while (j >= 0 && t < a[j]) //边比较寻找插入位置边移动元素
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = t; //插入元素到有序区
}
}
算法四:桶排序
实现原理
假定有1-100个编号的桶(也就是定义一个长度为100的整型一维数组),每输入一个数字·就在对应的桶上插一个小旗(也就是对应下标的桶加1次),如果这个数字出现了n次就在对应桶上插n个小旗,当所有数输入完毕时,只需要从下标1开始找那些数字是1,如果是1就打印1次,是2就打印2次,是多少就打印多少次。
代码实现
void test(int a[], int n)
{
int s[10]= {0};
for(int i=0; i<n; ++i)
s[a[i]]++;
for (int i=0; i<10; ++i)
for (int j=0; j<s[i]; ++j)
printf("%d ",i);
}
《啊哈!算法》强烈推荐!