七大排序算法

#include<iostream>

using namespace std;

//swap

void swap(int &a,int &b){

    int temp;

    temp = a;

    a = b;

    b= temp;

}

 

//冒泡排序

void BubbleSort(int *a,int n){

    int i = n;

    int temp;

    while(i>0){

        int pos = 0;

        for(int j = 0;j < n;j++){

            if(a[j] > a[j+1]){

                temp = a[j];

                a[j] = a[j+1];

                a[j+1]= temp;

                pos = j;

            }

            i = pos;

        }

    }

}

 

//快速排序

int partition(int *a, int low, int high){

    int key = a[low];

    while(low<high) {

        while(low<high && key<=a[high]) 

            high--;

        swap(a[low],a[high]);

        while(low<high && key>=a[low])

            low++;

        swap(a[low],a[high]);

    }

    return low;

}

 

void quickSort(int *a,int low, int high){

    if(low<high){

        int pos = partition(a,low,high);

        quickSort(a,low,pos-1);

        quickSort(a,pos+1,high);

    }

}

 

//选择排序

void choiceSort(int *a,int n){

    int minindex;

    for(int i=0;i<n;i++){

        for(int j = i;j<n;j++){

            minindex = i;

            if(a[j]<a[minindex]){

                minindex = j;

            }

        }

    swap(a[minindex],a[i]);

    }

}

 

//堆排序

void adjustDown(int *a,int i,int n){

    int j=i*2+1;

    while(j<n){

        if(j+1<n && a[j]>a[j+1])

            j++;

        if(a[i]<a[j])

            break;

        swap(a[i],a[j]);

        i = j;

        j = i*2+1;

    }

}

 

void makeHeap(int *a,int n){

    int i=0;

    for(i = n/2-1;i>=0;i--){

        adjustDown(a,i,n);

    }

}

 

void heapSort(int *a, int n){

    int i = 0;

    makeHeap(a,n);

    for(i=n-1;i>=0;i--){

        swap(a[i],a[0]);

        adjustDown(a,0,i);

    }

}

 

//插入排序

void insertSort(int *a,int n){

    for(int i=1;i<n;i++){

        for(int end=i-1;end>=0;--end){

            if(a[end]>a[end+1]){

                swap(a[end],a[end+1]);

            }

            else

                break;

        }

    }

}

 

//希尔排序

void shellSort(int *a,int n){

    int index = n/2;

    int temp = 0;

    while(index>=1){

        cout << "index=" << index << endl;

        for(int i = index;i<n;i++){

            cout << "i=" << i << endl;

            for(int j = i-index;j>=0;j-=index){

                cout << j << " "<<j+index << endl;

                if(a[j]>a[j+index]){

                   //cout << j << " "<<j+index << endl;

                   swap(a[j],a[j+index]);

               }

            }

        }

        index = index/2;

    }

}

 

//归并排序

void merge(int *a, int start, int mid, int end)

{

    int *tmp = (int *)malloc((end-start+1)*sizeof(int));    // tmp是汇总2个有序区的临时区域

    int i = start;            // 第1个有序区的索引

    int j = mid + 1;        // 第2个有序区的索引

    int k = 0;                // 临时区域的索引              

    while(i <= mid && j <= end){

        if (a[i] <= a[j])

            tmp[k++] = a[i++];

        else

            tmp[k++] = a[j++];

    }

    while(i <= mid)

        tmp[k++] = a[i++];

    while(j<=end)

        tmp[k++] = a[j++];

    

                                                                                                                      // 将排序后的元素,全部都整合到数组a中。

    for (int i = 0; i < k; i++)

        a[start + i] = tmp[i];

    free(tmp); 

}

void mergeSort(int *a, int start, int end){

    if(a==NULL || start >= end)

        return ;

    int mid = (end + start)/2;

    mergeSort(a, start, mid); // 递归排序a[start...mid]

    mergeSort(a, mid+1, end); // 递归排序a[mid+1...end]

 

    // a[start...mid] 和 a[mid...end]是两个有序空间,

    // 将它们排序成一个有序空间a[start...end]

    merge(a, start, mid, end);

}

              

//打印数组

void pt(int *a,int s,int n){

    for(int i=s;i<n;i++)

        printf("%d ",a[i]);

    printf("\n");

}

 

int main(){

    int a[8] = {1,4,3,5,2,9,7,6};

    //BubbleSort(a,5);

    //quickSort(a,0,4);

    mergeSort(a,0,8);

    pt(a,0,8);

}

posted on 2018-09-07 11:36  丫头妹  阅读(175)  评论(0)    收藏  举报

导航