桶排序
适用于知道数组值的取值范围(较小)的排序
思想:根据数组的取值范围创建一个从0开始到数组取值范围最大值的桶数组,然后将桶数组中的数初始化为0,然后将数组中的值一一用值对应相对的桶数组下标的值将对应下标指定值+1,然后按顺序打印出桶每个下标值对应次数的下标值。
冒泡排序
思想:比较相邻的两个元素,如果顺序出错,就交换位置;一趟排好一个数,排数组大小-1趟就排好序列了。
伪代码:
Sort(A)
{
for(int i = 1; i <= A.length-1; i++) //代表第几趟
{
for(int j = 1; j <= A.length-i; j++) //每一趟都不同再比较最后一个,因为最后的都是最大数
{
if(A[j] > A[j+1])
{
exchange A[i] with A[j];
}
}
}
}
快速排序
思想:将一个数组以某个基点分为2组,该基点的左边的数都小于等于它,右边的数都大于等于它,然后对左边的子数组和右边的子数组递归相同的操作,最终可以得到排好序的数组。
复杂度:最差的情况下和冒泡排序一样都是n^2,但是平均情况是nlogn。
伪代码:
设i为左边起始指针,j为右边起始指针,k为基数点。
QuickSort(A,left,right)
{
i = left;
j = right;
k = A[i];
if (i > j)
{
return;
}
while(i < j)
{
while(i < j && A[j] >= k)
{
j--;
}
while(i < j && A[i] <= k)
{
i++;
}
if (i < j) //必须要判断,上面2个循环中的判断只是用于退出循环
{
int t = A[i];
A[i] = A[j];
A[j] = t;
}
}
A[left] = A[i];
A[i] = k;
QuickSort(A,left,i-1);
QuickSort(A,i+1,right);
}