常用排序算法

一、简单排序,时间复杂度为O(n2)

1.1:直接插入排序:在插入第i个记录时,R1,R2,...Ri-1,Ri已经排好序,这时将关键字ki依次与关键字ki-1, ki-2,...,k1进行比较,从而找到应该插入的位置,然后将ki插入,插入位置及其后面的记录依次向后移。

    时间复杂度为:O(n2)  

    排序整个过程语言描述:

    step1:将位置0数和位置1上的数进行比较,如果位置1上的数更小,将和位置为0上的数进行交换。

    step2:将位置2上与位置1上的数进行比较,如果位置2上的数比位置1上的数小,比位置0上的数大,则与位置1上的数进行交换;如果位置2上的数比位置0上的数还小,则将位置2上的数备份,将位置0和位置1的数往后移,然后将备份的数插入到位置0。

    ...

    step(n-1):将位置n-1上的元素与前面位置的数依次比较,找到合适的位置,将后面的数依次往后移,然后插入数字,则整个数组完成排序。

     

1.2:冒泡排序:(正序为例子)首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则交换两个记录的值,然后比较第二个记录和第三个记录的关键字,以此类推,直至第n-1个记录和第n个记录的关键字进行比较过为止。这个过程称为一次排序。

    第一次冒泡的结果是将最大的值放到第n个记录位置上,就是将最大的值沉底,然后进行第二次冒泡排序,对前n-1个记录进行同样的操作,其结果是将关键字次大的记录安放在地n-1个记录位置上。当进行完成了n-1次冒泡排序后,所有记录有序排序完成。

    排序整个过程语言描述:

    step1:第一步交换的区间时0~n-1,也就是整个数组的整体,然后将第一个数和第二个数进行比较,哪个大哪个就放在后面。然后是第二个数和第三个数进行比较,哪个大就放在后面,以此这样子往下比较,最后会将最大的数放在数组的最后面。

      step2:第二步将范围调整为0~n-2,这样最后倒数第二大的数将会放在数组的倒数第二的位置。

    ...

    step(len-1):以此这样子操作下去,直到区间变为0~1,也就是只剩最后一个最小的数,(len-i)=1时,数组的所有元素完成排序。

              时间复杂度:O(n2)

  C例子:

                       

 

1.3:简单选择排序:通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换,当i等于n时所有记录有序排序。

                      简单地说就是每次找出一个最值,放在合适的位置后,当进行n次最值查找后排序完成。

      时间复杂度:O(n2)

      排序整个过程语言描述:

      step1:在整个数组范围0~n-1中选择一个最大值放到最后一个位置,即为n-1位置上。

      step2:然后再0~n-2的范围中选择一个最大值放到倒数第二的位置上,即为n-2位置上。

      ...

      step(n-1):到最后n-1步的时候,只剩下一个数,放在第一个位置上,这时,整个数组就是有序的了。

                       

时间复杂度为O(N*log2N)的排序

希尔排序:设置了步长的插入排序

          

 2.时间复杂度为O(N*logN)的排序

2.1快速排序:设定划分值的排序方法

  快速排序的思想:通过一趟排序将待排的记录分割为独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后在分别对这两部分记录继续进行排序,以达到整个序列有序。

  排序整个过程语言描述:

    step1:一次完整的划分过程,首先设定一个划分值,将数组头和尾设置标签Low和High,选择最后一个值作为一次划分值,则最后一个位置可以空出来,从左往右比较,如果遇到比划分值大的值,则交换Low和High两个数,然后从右往左比较,如果遇到比划分值小的数值再次交换Low和High两个数,直到Low=High。此时完成一次的划分,划分值左边的值比划分值小,右边的值比划分值大。

    step2:经过一次排序后,数组会被分为左右两段子,左端子数组小于划分值,右端子数组大于划分值,然后将两端继续进行快速排序。

    step3:每次划分后都会产生新的左右两端子数组,继续进行快排,直到最后执行的快排不会再产生新的子数组,即Low==High,此时完成排序。

                    

 2.2 堆排序

 

 

3.时间复杂度为O(N)的排序

  桶排序的思想是实现时间复杂度为O(N)的排序算法。

3.1计数排序

  例如:按身高进行排序。

  Step1:身高范围是100-300,设定一个数号数分别为100-300号的桶。

  Step2:将排序对象按照身高放入到对应的桶里面。

  Step3:将桶号100-300分别有序地倒出对象,倒出对象的序列就是排好序的对象。

  实例:张三:176,李四:186:王五:190

  step1:定义标签100-300的数组。

  step2:按照身高进行装桶操作,分别将张三放入到176号桶,李四放入到186号桶,王五放入到190号桶。

  step2:按桶号遍历,分别从100-300出桶,分别出对象:张三,李四,王五。

3.2基数排序

  例如将下列数字进行排序023,016,101,072,096,011

  Step1:按照数字定义一个桶,即定义一个数组A[10]。

  Step2:将所有数字按照个位进行入桶操作。A[Num%10] = Num;这时候入桶的对象分别有:1:101,011;2:072;3:023;6:016,096

  Step3:依次倒出所有的数值,顺序分别为:101,011,072,023,016,096

  Step4:再将所有数值按照十位的基数进行入桶操作,A[Num/10%10] = Num;这时候入桶的对象分别为:0:101;1:011 016;2:023;7:072;9:096

  Step5:依次出桶所有数,顺序分别为:101,011,016,023,072,096

  Step6:将所有数值按照百位数值进行入桶操作,A[Num/100%10] = Num;这时候入桶的对象分别为:011,016,023,072,096;1:101

  Step7,:依次出桶所有数,顺序分别为:011,016,023,072,096,101。

posted on 2020-06-30 22:02  King-Penguin  阅读(152)  评论(0编辑  收藏  举报

导航