一,冒泡排序
外循环遍历n-1次
内循环从头向后交换,这样就能将最大的数字放到最后。
void selectsort(int a[MAX])//选择排序
{
int i, temp, min, j;
for (i = 0; i < MAX - 1; i++)
{
min = i;
for (j = i + 1; j < MAX; j++)
{
if (a[j] < a[min])
{
min = j;
}
}
if (min != i)
{
temp = a[min];
a[min] = a[i];
a[i] = temp;
}
}
}
二,选择排序
对数据量较少的序列实现升序或降序排序,可以考虑使用选择排序算法,它对应的时间复杂度为O(n2)
每次从待排序序列中找出最大值或最小值,查找过程重复 n-1 次。对于每次找到的最大值或最小值,通过交换元素位置的方式将它们放置到适当的位置,最终使整个序列变成有序序列。
与冒泡不同的是选择排序是直接找最小的放入指定的位置,而不是两两互相交换
void selectsort(int a[MAX])//选择排序
{
int i, temp, min, j;
for (i = 0; i < MAX - 1; i++)
{
min = i;
for (j = i + 1; j < MAX; j++)
{
if (a[j] < a[min])
{
min = j;
}
}
if (min != i)
{
temp = a[min];
a[min] = a[i];
a[i] = temp;
}
}
}
三,插入排序
初始状态下,将待排序序列中的第一个元素看作是有序的子序列。从第二个元素开始,在不破坏子序列有序的前提下,将后续的每个元素插入到子序列中的适当位置。
先将遍历的第一个数字及其位置记下来,然后将前面数字与比较,前面的值大,就将前面的值赋给后面。最后将对应放入的值位置更改为最开始的值。
void insertsort(int a[MAX])
{
int position, i = 0, insertdata;
for (i = 0; i < MAX; i++)
{
insertdata = a[i];
position = i;
while (a[position - 1] > insertdata && position > 0)
{
a[position] = a[position - 1];
position--;
}
if (position != i)
{
a[position] = insertdata;
}
}
}
四,希尔排序
需要分组的插入排序。
void shellsort(int a[MAX])//希尔排序 (插入排序的优化)
{
int gap = 1, position, i, insertdata;
while (gap < MAX / 3)
{
gap = gap * 3 + 1;
}
while (gap > 0)
{
for (i = gap; i < MAX; i++)
{
insertdata = a[i];
position = i;
while (a[position - gap] >= insertdata && position > gap - 1)
{
a[position] = a[position - gap];
position -= gap;
}
if (position != i)
{
a[position] = insertdata;
}
}
gap = (gap - 1) / 3;
}
}
五,快速排序(递归)
递归的方法,找一个关键值key。
从前向后找大于key值的放到high的位置。
从后向前找小于key的值放到low的位置。
low==high 的时候结束。
再排前半部分和后半部分
void partition(int* a, int low, int high)//快速排序
{
int k = low;
int j = high;
if (low >= high)
return;
int key = a[k];
while (k< j)
{
while (a[j] >= key&& k < j)
{
--j;
}
a[k] = a[j];
while (a[k] <= key && k < j)
{
++k;
}
a[j] = a[k];
}
a[k] = key;
partition(a, low, j - 1);
partition(a, j + 1, high);
}