快速排序:
这个思想不仅可以用于排序,还可以用于求第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;
}