方法一:(桶排序)
我们直观的想法肯定是将a数组中的数据从大到小的顺序排序,但由于我们输入的n个数的值都比较小,是介于0-1000之间的,所以我们采取的办法是开设一个长度为k+1的数组c,
c[0]中我们统计值为0的个数,c[1]中统计值为1的个数,c[2]中统计值为2的个数……c[k]记录值为k的个数,统计完成后我们按照0-k的顺序输出c[i]个i即可。这就是传说中的桶排序。
方法二:(选择排序)
第一次从第一个数到第n个数中找出最小的那个数和第一个位置上的数交换位置
第二次从第2个数到第n个数中找出最小的那个数和第二个位置上的数交换位置
……
最后一次从第n-1个数到第n个数中找出最小的那个数和第n-1个位置上的数交换位置
方法三:(冒泡排序)推荐初学用这种方法
一次比较相邻的两个数是不是逆序对(前一个数比后一个数大),如果是逆序对就交换两个数的位置,即第1个数和第2个数比,若是逆序对就交换这两个数的位置,,接着第2个数和第3个数比,若是逆序对,则交换两个数的位置……直到第n-1个数和第n个数比较,经过一轮后我们发现最大的那个数会被放在第n个位置,此时将n个数的排序问题转化为n-1个数的排序问题,第二轮又比较第1个位置上和第2个位置上的数,若是逆序对则再交换位置,一直到第n-2个数和第n-1个数比较并交换位置。
经过第二轮后我们发现次大的那个数会被放第n-1个位置,……如此经过n-1轮后,原来的数列就变成了有序的数列。
方法四:(插入排序)
当读入一个数时,在已经排序好的序列中,搜寻它正确的位置并放入该数【插入一个数时考虑是否需要将后面的元素往后移动】。
方法五:(归并排序)
假如需要排序的数组区间为(L,R),分治的思想是将区间为(L,R)的排序问题,先转化为区间(L,(L+R)/2)和区间((L+R)/2+1,R)排序的子问题,然后将两个有序的子区间
(L,(L+R)/2)和((L+R)/2+1,R)合并为一个有序序列,同理两个子区间(L,(L+R)/2)和((L+R)/2+1,R)也可以分为规模更小的子区间排序
的子问题,并将子区间合并为有序序列……
方法六:快排
我们在需要排序的序列中随机找一个参照值,然后将大于这个参照值的数都移到它的后面,将小于这个参照值的数都移到它的前面,这样参照值前面的数都是小于参照值的数,参照值后面的数都是大于参照值后面的数。
此时,以参照值为界,将小于参照值和大于参照值的两部分作为两个新的待排序的序列,同理,在小于它的数和大于它的数中又分别重新选择一个新的参照值,递归执行上面的操作,最终将得到一个从小到大排列的数列。
参照值的选择策略:为写程序方便我们通常选择处于同一位置的数作为参照值,比如第一个数,最后一个数或者中间位置的数