- 归并排序
- 应用:
- 快速排序
- 希尔排序
- 堆排序(建大堆)朗
#includeusing namespace std; int a[100],n; long long ans; void hebing(int low,int mid,int high) { int b[100],k=0,j=mid+1,i=low; while(i<=mid&&j<=high) { if(a[i]<=a[j]) b[k++]=a[i++]; else b[k++]=a[j++],ans+=mid-i+1; } while(i<=mid) b[k++]=a[i++]; while(j<=high) b[k++]=a[j++]; for(int i=low,k=0;i<=high;i++,k++) a[i]=b[k]; } void guibing(int low,int high) { int mid; if(low mid=(high+low)/2; guibing(low,mid); guibing(mid+1,high); hebing(low,mid,high); } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); guibing(1,n); cout< 应用: 洛谷1908逆序对
AC代码:#includeusing namespace std; int a[100],n; long long ans; void hebing(int low,int mid,int high) { int b[100],k=0,j=mid+1,i=low; while(i<=mid&&j<=high) { if(a[i]<=a[j]) b[k++]=a[i++]; else b[k++]=a[j++],ans+=mid-i+1; } while(i<=mid) b[k++]=a[i++]; while(j<=high) b[k++]=a[j++]; for(int i=low,k=0;i<=high;i++,k++) a[i]=b[k]; } void guibing(int low,int high) { int mid; if(low mid=(high+low)/2; guibing(low,mid); guibing(mid+1,high); hebing(low,mid,high); } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); guibing(1,n); cout< 快速排序 #includeusing namespace std; int n,a[10000]; void qsort(int a[],int x,int n) { if(x int low=x,high=n,mid=a[x]; while(low while(low a[low]=a[high]; low++; } while(low a[high]=a[low]; high--; } } a[low]=mid; qsort(a,1,low-1); qsort(a,low+1,n); } } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; qsort(a,1,n); for(int i=1;i<=n;i++) cout< 希尔排序 #includeusing namespace std; #define max 0x7ffffff int a[max],gap,i; int main() { cin>>a[i]; while(a[i]) cin>>a[++i]; for(int j=1;j<=3;j++) { cin>>gap; for(int k=0;k int end=k; int tem=a[end+gap]; while(end>=0) { if(tem a[end+gap]=a[end]; end-=gap; } else break; } a[end+gap]=tem; } for(int k=0;k<=i-1;k++) cout< 堆排序(建大堆)朗 #includeusing namespace std; #define Max 0x7ffffff int a[Max],n,i=1; //向下调整算法(建大堆) void AdjustDown(int arr[], int size, int root){ int j = 2 * root,flag=0; while(j<=size && !flag) { if(j+1<=size && arr[j+1]>arr[j]) j+=1; if(arr[root]>arr[j]) flag=1; else { swap(arr[j],arr[root]); j=2*j; } } //建立大堆 void CreateHeap(int arr[], int size){ for (int i = size / 2; i >= 1; i--){ AdjustDown(arr, size, i); } } void HeapSort(int arr[], int size) { //建立初始大堆 CreateHeap(arr, size); //打印出大根堆 for(int k=1;k<=size;k++) cout< =2; i--){ swap(arr[1], arr[i]); AdjustDown(arr, i-1, 1); //打印每一趟的结果 for(int k=1;k<=size;k++) cout< cin>>a[i]; while(a[i]) cin>>a[++i]; HeapSort(a,i-1); return 0; } //8 3 6 1 68 12 0 //68 8 12 1 3 6 //12 8 6 1 3 68 //8 3 6 1 12 68 //6 3 1 8 12 68 //3 1 6 8 12 68 //1 3 6 8 12 68



