1.选择排序
首先,第一轮循环,取第一个数,与数组中接下来的数进行比较,找到数组中最小的数,与第一个数交换;第二轮循环,取第二个数,与数组中接下来的数进行比较,找到数组中最小的数,与第二个数交换...
大概有N^2/2次比较,N次交换
2.插入排序
对于数组a[],第一轮循环,i=1,j=i,如果a[j]小于a[j-1],两者值交换,j--,继续判断,直到j=0;第二轮循环,i=2,j=i,如果a[j]小于a[j-1],两者值交换,j--... 即a[0]到a[i-1]是有序区,a[i]到a[a.length-1]是无序区,取无序区的一个数在有序区中比较,交换。
通过将a[i]与 a[0]到a[i-1]范围内的所有数比较,找到比a[i]小的数,两者交换,取小的那个数,继续与前面的数比较,直到i=0,此时,小的数就排在前面了。
平均比较和交换大概是N^2/4
3.希尔排序
对于数组a[],取一个小于a.length的数d,将数组分成d个组,组内元素下标相差d,如,数组内有0,1,2,3,4,5,6,7,8,9,取d=5,即分为0,5一组,1,6一组,2,7一组,3,8一组,4,9一组,对各组进行插入排序,然后取d=2,...分组,对各组进行插入排序,直到d=1,此时所有元素都放在同一个组中,即数组本身,此时顺序排完
4.归并排序
自顶向下的归并排序:将数组分成两半,前面一组进行排序,后面一组进行排序,然后在合并成一个大数组,可以发现,这可以形成一种递归,
自底向上的归并排序:第一次循环,每两个元素为一组进行排序,第二次循环,每四个元素为一组进行排序,第三次循环,每八个元素为一组进行排序,直到等于数组长度
5.快速排序
取定一个元素,从左往右找到第一个大于取定元素的元素,从右往左找到第一个小于取定元素的元素,两者交换,可以发现,这能形成一种递归,这样取定元素的左边元素都小于取定元素,取定元素的右边都大于取定元素
可以发现快速排序跟自顶向下的归并排序有点相似,区别:归并排序递归发生在处理整个数组之前,快速排序发生在处理整个数组之后;归并排序将数组分成两个子数组分别排序,然后合并成有序数组,快速排序是两个子数组有序时,整个数组就有序了
6.优先队列
二叉堆(父节点要比两个子节点大)实现,用数组表示,父节点下标 k 与 两个子节点下标 2k,2k+1,k不等于0
上浮:如果该节点的值大于父节点,交换
下沉:如果顶点元素小于两个子节点,与左右节点间大的那个交换
堆排序:首先将原始数组转化为初始堆,对于数组a[],从num = a.length/2开始,判断a[num]是否小于其左右子节点(可以先判断左右子节点哪个比较大,在与父节点比较),如果是,则交换,下标换成与之交换子节点下标,在判断其是否小于左右子节点,如此反复直到没有左右子节点,然后num-1,继续反复,直到num=1,此时初始堆形成。堆顶元素总是最大的
在初始堆中,从i=a.length来说,不断的i--,与堆顶元素,即a[1]元素交换,然后在按上面的方法调整成堆,这样,堆顶元素就会换到后面,如此反复,数组中的数即从小到大排列了
参考算法 第四版