1.堆排序
//调整为大栈堆
void reheap(int arr[],size_t n,size_t index){
int key=arr[index];
int child=2index+1;
while(child<n){
if(child+1<n && arr[child+1]>arr[child]){
++child;
}
if(arr[child]>key){
arr[index]=arr[child];
index=child;
child=2index+1;
}
}
arr[index]=key;
}
void swap(int *pa,int *pb){
int t=*pa;
*pa=*pb;
*pb=t;
}
void heap_sort(int arr[],size_t n){
int i,j;
for(i=n/2-1;i>=0;–i){
reheap(arr,n,i);
}
for(j=n-1;j>0;–j){
swap(&arr[0],&arr[i]);
reheap(arr,i,0);
}
}
2.归并排序
void merer_arr(int arr[],int left,int right){
int mid=(left+right)/2;
int size=mid-left+1; //前size个有序数
int *brr=calloc(size,sizeof(int));
int i;
for(i=0;i<size;i++){ //把前size个有序数写入到brr中
brr[i]=arr[left+i];
}
int j,k;
i=left,j=0,k=mid+1;
while(j<size && k<=right){ //写入到arr中
if(brr[j]<arr[k]){
arr[i++]=brr[j++];
}else{
arr[i++]=arr[k++];
}
}
while(j<size){
arr[i++]=brr[j++];
}
}
void merger(int arr[],int left,int right){
if(left>=right){
return;
}
int mid=(left+right)/2;
merger(arr,left,mid); //使[left,mid]区间的数有序
merger(arr,mid+1,right); //使[mid+1,right]区间的数有序
merger_arr(arr,left,right);
}
void merger_sort(int arr[],size_t n){
merger(arr,0,n-1);
}
3.计数排序
void count_sort(int arr[],size_t n){
int max=arr[0];
int min=arr[0];
int i=0;
for(i=0;i<n;i++){ //找出最大和最小值
if(max<arr[i]){
max=arr[i];
}
if(min>arr[i]){
min=arr[i];
}
}
int len=max-min+1; //最大和最小值间相差的个数
int brr[len];
for(i=0;i<len;i++){
brr[i]=0;
}
for(i=0;i<n;i++){
brr[arr[i]-min]++; //记录arr[i]值的个数
}
int j=0;
for(i=0;i<len;i++){
while(brr[i]>0){
arr[j++]=min+i;
–brr[i];
}
}
}
4.快速排序
void quike(int arr[],int left,int right){
if(left>=right){
return;
}
int key=arr[left];
int i=left,j=right;
while(i<j){
while(i<j && arr[j]>=key){
–j;
}
arr[i]=arr[j];
while(i<j && arr[i]<=key){
++i;
}
arr[j]=arr[i];
}
arr[i]=key;
quike(arr,left,i-1);
quike(arr,i+1,right);
}
void quike_sort(int arr[],size_t n){
quike(arr,0,n-1);
}
5.基数排序
int count_of_num(int num){ //求num的位数
int cnt=0;
do{
++cnt;
num=num/10;
}while(num!=0);
return cnt;
}
int bit_of_num(int num,int bit){ //求num第bit位的数是多少
int i;
for(i=1;i<bit && num!=0;i++){
num=num/10;
}
return num%10;
}
void base_sort(int arr[],size_t n){ //排序需要用10个链表作为容器
int max=arr[0];
int i;
for(i=1;i<n;i++){ //得出最大值
if(max<arr[i]){
max=arr[i];
}
}
int cnt=count_of_num(max); //求出最大值的位数
SLink vect[10]={};
for(i=0;i<10;i++){
vect[i]=slink_create(); //创建10个链表
}
int bit;
for(bit=1;bit<=cnt;bit++){
for(i=0;i<n;i++){
int n=bit_of_num(arr[i],bit); //得到arr[i]的bit位的值
slink_push_back(vect[n],arr[i]); //把arr[i]放到对应的容器中
}
int j=0;
for(i=0;i<10;i++){
while(!slink_is_empty(vect[i])){
int n=slink_get_front(vect[i]); //按顺序从10个链表中拿出数值,放入arr[j]中
arr[j++]=n;
slink_pop_front(vect[i]);
}
}
}
for(i=0;i<10;i++){
slink_destroy(vect[i]);
}
}
5种深层次的排序
最新推荐文章于 2023-03-25 00:51:13 发布