排序是日常生活中最常见的操作,也是算法中最有趣的问题之一,排序问题可以描述为:
输入:n个数<a1,a2,…,an>
输出:输入序列的一个排列(即重新排序)<a1’,a2’,….,an’>,使得a1’<=a2’<=…<=an’。
待排序的数也称为关键字(key)。
本篇文章将列举出常见的排序算法,分别从思想、复杂度、稳定性等方面,总结其优劣和适用情形,并给出源码示例。
要想解决排序问题,最直观也是最简单的做法就是两两比较,每次找出当前最大(最小)的,直至整个排序完成。这种算法有一个比较形象的的名字叫“冒泡法”。
一、冒泡排序(BubbleSort):
思想:
冒泡排序的是第一次通过两两比较,找出a1-an中最大的数,并将其放在an的位置,然后第二次执行同样的操作,找出a1-an-1中最大的数,放在an-1的位置,如此下去,直至待排序集合只剩一个数。
代码:
输入:n个元素的数组A[0…n-1]
输出:按非降序排列的数组A[0…n-1](下同)
1 void BubbleSort(int A[],int length) 2 3 { 4 5 for(int i=1; i<length; i++) 6 7 { 8 9 for(int j=1; j<=length-i; j++) 10 11 { 12 13 if(A[j-1]>A[j]) 14 15 { 16 17 swap(A[j-1],A[j]); 18 19 } 20 21 } 22 23 } 24 25 }