常见排序算法
(1)冒泡排序
冒泡排序就是相邻元素不断比较,一次循环之后,第一个数不用再比较,从i+1开始,如果前者大,则交换,如果某次循环没有交换数据,那么排序结束
for(int i=0;i<n;i++)
Swap = false;
for(int j=n-1;j>i;j--)
{
if(arr[j] > arr[j-1])
{swap=true; 交换}
}如果swap=false,则本次循环没有交换,排序结束
可以看出,相等元素是不会进行交换的,即使不相邻,他们也不会,所以它是一个稳定的排序算法
(2)选择排序
选择排序是每次选择出第i小的元素,放到第I个位置上
for(int i=0;i<n;i++)
{ small = arr[i]
for(int j=i+1;j<n;j++)
{ if(arr[j] < small) small = arr[i]; index = j}
arr[i] = small; arr[index] = arr[i]
}
当一个小的元素,在2个大的相等元素的后边,那么选择最小值后,交换了小的和前面的那个大数,破坏了稳定性
(3)插入排序
插入排序是从第2个开始,不断和前面的元素比较,比他大就往后移,第i个元素前面的序列是有序的。碰到比他小的数后,给小数后面的那个数赋值
for (int i=1;i<n;i++)
{ tmp=arri[i]
for(j = i;j>=1;j--)
if(tmp < arr[j] ) arr[j] = arr[j-1] else break;
arr[j+1] = tmp;
} 相等元素不会交换,它是稳定排序
(4)快速排序
快速排序选择一个轴值,比他小的放左边,比他大的放右边,轴值可能与几个数相等,且位于这几个数相对位置的中间,那么必定会调整其他几个放到左边或者右边,
所以快排不是一个稳定的算法
(5)归并排序
归并排序是把序列递归的分成两部分,小序列不断归并,相等元素相对位置没有改变,它是稳定的排序算法
(6)堆排序
堆排序首先要建堆,也就是从最后一个不是叶子结点的结点开始,向下调整,然后堆顶和最后一个数交换,也就是出堆,堆顶向下调整
因为堆的父结点不大于子结点,有可能父节点与一个子结点相等,另一个子结点大,出堆后父节点放到了数组尾部,改变了相对位置,所以堆排序不稳定