排序算法感想2

         快速排序:

         这个思想不仅可以用于排序,还可以用于求第k个数字。

         代码:

         QuickSort(int* arr , int left,int right)

         {

                   If(left>=right)

                            Return ;

                   Int pivot,i,j;

                   Pivot= left;

                   I=left;

                   J=right;

                   While(i<=j)

                   {

                            While(arr[i]<=a[pivot]&&i<=j)i++;

                            If(i>j)

                                     break;

                            While(arr[j]>a[pivot]&&i<=j)j--;

                            If(i>j)

                                     break;

                            Swap(arr[I],arr[j]);

                            I++;j--;

                   }       

                  Swap(pivot,j);

                   Quicksort(arr,left,j)

                   Quicksort(arr,j+1,right);

         }

         快速排序pivot的选取可以随机数,这样比较好。

         归并排序:

         Void sort(int* arr, int left, int right)

{

         If(left>=right)

                   Return ;

         Int middle = (left+right)/2;

         Sort(arr,left,middle);

         Sort(arr,middle+1,right);

         Merge(arr,left,right,middle);     //merge就是对两个有序的数组进行合并。借助一个辅助数组来实现。这个代码我就不写了。有个优化的就是倒过来。也就是说那个辅助数组存放的时候就是left—middle right—middle+1.这么个存放,设两个指针index1=left,  index2=middle+1的那个位置也就是辅助数组的最后一个位置。

         }

         堆排序:

         堆排序的实现,先将完全二叉树建立起来,建立的过程中先将进来的数据存放到底部,然后再调整。这个还行。

         桶式排序:基于小范围的数字。

         基数排序:这个是运用多个关键字排序和桶式排序的结合体。

         代码:

         Radix=1;

For(i=1;i<=d;i++)       //代码d个关键码

         {

                   For(j=0;j<10;j++)

                            Count[j]=0;

                   For(j=0;j<n;j++)

                   {

K=(arr[j]/radix)%10;

         Count[k]++;

}

For(j=1;j<n;j++)

         Count[j]+=count[j-1];

For(j=n-1;j>=0;j--)

{

K=(arr[j]/radix)%10;

         Count[k]++;

         Temp[count[k]]=arr[j];

}

For(j=0;j<n;j++)

         Arr[j]=tem[j];

                   radix*=10;

         }

转载于:https://www.cnblogs.com/gui--li/archive/2011/06/08/2075646.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值