排序的方式太多了,先重点掌握几个,其余有机会慢慢学习!!
一:概念知识点介绍
1)时间复杂度
一般用最深层循环内的语句中的原操作的执行频度(重复执行的次数)来表示;
如:
for(int i=0;i!=m;i++)
{
}
在这个双重循环中,第二个for循环是最深层循环,执行频度为m*n,因为时间复杂度为O(m*n);
常用时间复杂度比较:
O(1)<O(㏒n)<O(n)<O(n㏒n)<O(n2)<O(n3)
O(2n)<O(n!)<O(nn)
2)空间复杂度
指算法编写程序后,在计算机运行中所需存储空间大小的度量;
3)排序的稳定性
排序算法的稳定性,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。
二:排序的简要比较
时间复杂度:O(n2)-O(n2)-O(nlogn)-O(nlogn)
冒泡排序/选择排序:具有稳定性,简单容易理解;效率低;
归并排序/不平衡二叉树排序:具有稳定性,比上快,比下慢;
堆排序/快速排序:不具有稳定性,速度快;
三:实现详解
1)冒泡
思想:
--比较相邻的元素,按需要进行交换;
--第一次大循环把最小的"沉"到最下面;
--第二次大循环把第二小的"沉"到倒数第二位置;
--依次类推..
--第i个位置:
--直到-第n-1个位置(n表示数组元素的个数,a[n-1]表示数组的最后一个数)
void _sort_buble(int a[],int n)
{
}
2)选择
思想:
--依次以(第0,1,2..i..n-1)位为基准,分别和剩下的位比较,找出当前一个最大的或者最小的放该位置;
一个大循环后结果和冒泡类似,不同的是,冒泡是相邻元素的两两比较,选择是以一个为基准和剩余的比较;
void _sort_select(int a[],int n)
{
}
3)归并
4)快速
思想:快速排序是冒泡的改进,通过一趟排序吧数据分为独立的两个部分,一部分所有的数据都比另一部分要小;
然后用递归在对这两部分分别进行快速排序...在循环执行,直到数据变成有序序列;
void QuickSort(int a[], int l, int r, bool Up)
{
int i,j;
int Mid,k;
i=l;
j=r;
Mid=a[(l+r)/2];
if (Up)
{
do
{
while (a[i]<Mid) ++i;
while (Mid<a[j]) --j;
if (i<=j)
{
k=a[i];
a[i]=a[j];
a[j]=k;
++i;
--j;
}
} while (i<=j);
}
else
do
{
while (a[i]>Mid) ++i;
while (Mid>a[j]) --j;
if (i<=j)
{
k=a[i];
a[i]=a[j];
a[j]=k;
++i;
--j;
}
} while (i<=j);
if (i<r) QuickSort(a,i,r,Up);
if (l<j) QuickSort(a,l,j,Up);
}
(2011-10-25 15:16:08)