/*
2016年7月7日20:30:37
排序的目的:查找
排序是查找的前提(google搜索)
分类:
冒泡(稳定O(n^2))
插入(稳定O(n^2)),从前往后依次插入到前面的有序部分,始终保持前面部分有序
选择(n^2),先从所有序列中选择最小的数字与第一个数字互换,再从余下的序列中寻找次最小值与第二个数字互换。。。
快排(最理想 O(nlogn) 最差O(n^2)),先找第一个元素的确切位置,把序列分成两半;再找左边第一个元素的位置,分成两半;再找右边第一个元素的位置。。。
归并(稳定nlgn),先两个一组排序,保证组内有序;再四个一组排序,保证组内有效;再八个
*/
1、冒泡排序
void bubble_sort(int* a, int len)//有效长度
{
int i, j, t;
for (i = 0; i < len - 1; i++)
{
for (j = i+1; j < len; j++)
{
if (a[i] < a[j])//降序
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
return;
}
2、插入排序
void insert_sort(int* a, int len)//将无序部分的第一个元素插入到前面有序部分
{
int i, j;
for (i = 1; i < len; i++)
{
int temp = a[i];
for (j = i-1; j >= 0 && a[j] > temp; --j)
{
a[j+1] = a[j];//依次往后移
}
a[j+1] = temp;//不满足条件后跳出循环,j 必然 -1
}
}
3、选择排序
void select_sort(int* a, int len)//选择最小值与第一个元素交换,再在余下的元素中选择次小值与第二个元素交换
{
int i, j, t;
int min;
for (i = 0; i < len - 1; i++)//选择的最后一个元素必然是最大值,所以是 len-1
{
min = i;
for (j = i+1; j < len; j++)
{
if (a[j] < a[min])
{
min = j;
}
}
t = a[i];
a[i] = a[min];
a[min] = t;
}
}
4、快速排序
int FindPos(int* a, int low, int high)
{
int val = a[low];//不能是 a[0]
while (low < high)
{
while (low < high && a[high] >= val)
--high;
a[low] = a[high];
while (low < high && a[low] <= val)
++low;
a[high] = a[low];
}
a[low] = val;
return low;
}
void quick_sort(int* a, int low, int high)//第二个参数表示第一个元素的下标,第三个参数表示最后一个元素的下标
{
int pos;
if (low < high)
{
pos = FindPos(a, low, high);
quick_sort(a, low, pos -1);
quick_sort(a, pos+1, high);
}
}