排序算法
输入整型数组和排序标识,对其元素按照升序或降序进行排序
http://www.nowcoder.com/questionTerminal/dd0c6b26c9e541f5b935047ff4156309
排序算法总结
在这个问题上总结了一下常见的排序算法,包括
- 插入排序
- 冒泡排序
- 选择排序
- 快速排序(split和partition两种调整轴值的方法)
- 希尔排序
- 归并排序
- 基数排序
- 堆排序
代码如下:
#include<stdio.h> #include<stdbool.h> bool compare(int a,int b){ return a>b; } void swap(int *a,int *b){ int temp=*a; *a=*b; *b=temp; } //基数排序 void radixsort(int arr[],int n,int flag){ int radix=10; int cnt[10]; int num=5;//位数 int temp[n]; for(int r=1,k=0;k<num;k++,r*=radix){ for(int i=0;i<radix;i++){ cnt[i]=0; } for(int j=0;j<n;j++){ cnt[arr[j]/r%radix]++; } for(int j=1;j<radix;j++){ cnt[j]=cnt[j]+cnt[j-1]; } for(int j=n-1;j>=0;j--){ cnt[arr[j]/r%radix]--; temp[cnt[arr[j]/r%radix]]=arr[j]; } for(int j=0;j<n;j++){ arr[j]=temp[j]; } } for(int i=0;i<n;i++){ if(flag) printf("%d ",arr[n-i-1]); else printf("%d ",arr[i]); } printf("\n"); } //堆排序 void partition(int arr[],int n,int i,int flag){ int j=2*i+1; if(flag){ //降序建小顶堆 while(j<n){ if(j+1<n&&arr[j+1]<arr[j]){ //左右子节点中找最小 j++; } if(arr[j]>arr[i]) break; swap(&arr[i],&arr[j]); i=j; j=j*2+1; } }else{ //升序建大顶堆 while(j<n){ if(j+1<n&&arr[j+1]>arr[j]){ //左右子节点中找最小 j++; } if(arr[j]<arr[i]) break; swap(&arr[i],&arr[j]); i=j; j=j*2+1; } } } void makeHeap(int arr[],int n,int flag){ for(int j=(n-1)/2;j>=0;j--) partition(arr,n,j,flag); } void heapsort(int arr[],int n,int flag){ makeHeap(arr,n,flag); for(int j=n-1;j>0;j--){ swap(&arr[0],&arr[j]); partition(arr, j, 0, flag); } for(int i=0;i<n;i++){ printf("%d ",arr[i]); } printf("\n"); } //希尔排序 void shellsort(int arr[],int n,int flag){ int incre=n/2; while(incre){ for(int i=0;i<incre;i++){ for(int j=i+incre;j<n;j+=incre){ for(int k=j;k>i;k-=incre){ if(flag){ if(arr[k]>arr[k-incre]){ swap(&arr[k-incre],&arr[k]); } else{ break; } }else{ if(arr[k]<arr[k-incre]){ swap(&arr[k],&arr[k-incre]); } else{ break; } } } } } incre/=2; } for(int i=0;i<n;i++){ printf("%d ",arr[i]); } printf("\n"); } //快速排序 int qpartition(int arr[],int left,int right,int flag){ int pivot=left; int temp=arr[left]; if(flag){ while(left<right){ while(right>left&&arr[right]<=temp) right--; while(right>left&&arr[left]>=temp) left++; if(left!=right) swap(&arr[left],&arr[right]); } }else{ while(left<right){ while(right>left&&arr[right]>=temp) right--; while(right>left&&arr[left]<=temp) left++; if(left!=right) swap(&arr[left],&arr[right]); } } swap(&arr[left],&arr[pivot]); return left; } int qspilt(int arr[],int left,int right,int flag){ int pivot=left; int temp=arr[left]; int index=left; if(flag){ for(int i=left+1;i<=right;i++){ if(arr[i]>=temp){ index++; swap(&arr[index], &arr[i]); } } }else{ for(int i=left+1;i<=right;i++){ if(arr[i]<=temp){ index++; swap(&arr[index], &arr[i]); } } } swap(&arr[left],&arr[index]); return index; } void solve(int arr[],int begin,int end,int flag){ if(begin<end){ int i=0; i=qpartition(arr, begin,end,flag); solve(arr,begin,i-1,flag); solve(arr,i+1,end,flag); } } void quicksort(int arr[],int n,int flag){ solve(arr,0,n-1,flag); for(int i=0;i<n;i++){ printf("%d ",arr[i]); } printf("\n"); } //归并排序 void merge(int arr[],int left,int middle,int right,int flag,int harr[]){ int i=left,j=middle+1,k=0; while(i<=middle&&j<=right){ if(compare(arr[i], arr[j])) { if (flag) harr[k++] = arr[i++]; else harr[k++] = arr[j++]; } else{ if (flag) harr[k++] = arr[j++]; else harr[k++] = arr[i++]; } } while(i<=middle){ harr[k++]=arr[i++]; } while(j<=right){ harr[k++]=arr[j++]; } k=0; while(left<=right) arr[left++]=harr[k++]; } void msort(int arr[],int left,int right,int flag,int harr[]){ if(left<right) { int middle = (left + right) / 2; msort(arr, left, middle, flag, harr); msort(arr, middle+1, right, flag, harr); merge(arr, left, middle, right, flag, harr); } } void mergesort(int arr[],int n,int flag){ int harr[n]; int left=0,right=n-1; int middle=(left+middle)/2; msort(arr,0,n-1,flag,harr); for(int i=0;i<n;i++){ printf("%d ",arr[i]); } printf("\n"); } //选择排序 void selectsort(int arr[],int n,int flag){ int i,j; for(i=0;i<n;i++){ int index=i; for(j=i+1;j<n;j++){ if(flag){ if(compare(arr[j], arr[index])){ index=j; } } else{ if(compare(arr[index],arr[j])){ index=j; } } } int temp=arr[i]; arr[i]=arr[index]; arr[index]=temp; } for(int i=0;i<n;i++){ printf("%d ",arr[i]); } printf("\n"); } //插入排序 void insertsort(int arr[],int n,int flag){ int i,j; for(i=1;i<n;i++){ int temp=arr[i]; for(j=i;j>0;j--){ if(flag){ if(compare(arr[j-1], temp)){ break; } } else{ if(compare(temp,arr[j-1])){ break; } } arr[j]=arr[j-1]; } arr[j]=temp; } for(int i=0;i<n;i++){ printf("%d ",arr[i]); } printf("\n"); } //冒泡排序 void bubblesort(int arr[],int n,int flag){ int i,j; for(i=0;i<n-1;i++){ for(j=n-1;j>i;j--){ if(flag){ if(compare(arr[j], arr[j-1])){ int temp=arr[j-1]; arr[j-1]=arr[j]; arr[j]=temp; } } else{ if(compare(arr[j-1], arr[j])){ int temp=arr[j-1]; arr[j-1]=arr[j]; arr[j]=temp; } } } } for(int i=0;i<n;i++){ printf("%d ",arr[i]); } printf("\n"); } int main(){ int n,iSortFlag; while(scanf("%d",&n)!=EOF){ int arr[n]; for(int i=0;i<n;i++) scanf("%d",&arr[i]); scanf("%d",&iSortFlag); radixsort(arr, n, iSortFlag); } return 0; }