排序算法

来源:互联网 发布:陈墨网络营销策划机构 编辑:程序博客网 时间:2024/06/08 10:12
#include <iostream>using namespace std;//插入排序void InsertSort(int a[],int n){for(int i=1;i<n;i++){for(int j=i-1;j>=0 && a[j]>a[j+1];j--){swap(a[j],a[j+1]);}}} //希尔排序(间接插入排序)void ShellSort(int a[],int n){for(int gap = n/2;gap > 0;gap /= 2){for(int i=gap;i<n;i++){for(int j=i-gap;j>=0 && a[j]>a[j+gap];j-=gap){swap(a[j],a[j+gap]);}}}} //选择排序void SelectSort(int a[],int n){for(int i=0;i<n-1;i++){  //从第一个位置开始int index = i;for(int j=i+1;j<n;j++){   //寻找最小的数据索引   if(a[j]<a[i]){index = j;}}if(index != i){//如果最小数位置变化则交换  swap(a[i],a[index]);}}} //快速排序void QuickSort(int a[],int l,int r){if(l<r){int i = l,j = r, x = a[l];while(i < j){while(i < j && a[j] >= x){// 从右向左找第一个小于x的数  j--;}if(i < j){a[i++] = a[j];}while(i<j && a[i]<x){// 从左向右找第一个大于等于x的数i++;}if(i<j){a[j--] = a[i];}}a[i] = x;QuickSort(a,l,i-1);QucikSort(a,i+1,r); }} //归并排序/*归并排序的效率是比较高的,设数列长为N,将数列分开成小数列一共要logN步,每步都是一个合并有序数列的过程,时间复杂度可以记为O(N),故一共为O(N*logN)。因为归并排序每次都是在相邻的数据中进行操作,所以归并排序在O(N*logN)的几种排序方法(快速排序,归并排序,希尔排序,堆排序)也是效率比较高的。*/void mergearray(int a[],int first,int mid,int end,int temp[]){int i = first,j = end;int m = mid,n = end;int k=0;while(i<=m && j<=n){if(a[i] <= a[j]){temp[k++] = a[i++];}else temp[k++] = a[j++];}while(i <= m){temp[k++] = a[i++];}while(j <= n){temp[k++] = a[j++];}for(i = 0;i < k;i++){a[first+i] = temp[i];}} void mergesort(int a[],int first,int end,int temp[]){if(firsr < end){mergesort(a,first,mid,temp);mergesort(a,mid+1,end,temp);mergearray(a,first,mid,end,temp);}}//有的书上是在mergearray()合并有序数列时分配临时数组,但是过多的new操作会非常费时。//因此作了下小小的变化。只在MergeSort()中new一个临时数组。后面的操作都共用这一个临时数组。bool MergeSort(int a[],int n){int *p = new int[n];if(p == NULL){return false;}mergesort(a,0,n-1,p);delete []p;return true;} int main(){        int n;        while(cin>>n){            for(int i=0;i<n;i++){                cin>>a[i];            }            ShellSort(a,n);            for(int i=0;i<n-1;i++){                cout<<a[i]<<' ';            }            cout<<a[n-1]<<endl;        }        return 0;    }      

0 0
原创粉丝点击