排序方法

来源:互联网 发布:网络教育公共课统考 编辑:程序博客网 时间:2024/05/22 15:22
/* 排序算法:冒泡,选择,插入,希尔,快速,归并 */#include <iostream>#include <stdlib.h>using namespace std;//声明函数void displayArray(int[] , int);void shellSort(int[] , int);void popperSort(int[] , int);void popperSort2(int[] , int);void chooseSort(int[] , int);void chooseSort2(int[] , int);void insertSort(int[] , int);void insertSort2(int[] , int);void fastSort(int[] , int , int);void merge(int[] , int , int , int);void mergeSort(int[] , int[] , int , int);int main(){    int arr[6] = {3,4,52,13,2,2};    //displayArray(arr , 10);    cout << "排序前,数组元素:" << endl;    displayArray(arr , 6);    //测试:希尔排序    //shellSort(arr , 6);    //测试:插入排序法1    //insertSort(arr , 6);    //测试:插入排序法2    //insertSort2(arr , 6);    //测试:冒泡排序法1    //popperSort(arr , 6);    //测试:冒泡排序法2    //popperSort2(arr , 6);    //测试:选择排序法1    //chooseSort(arr , 6);    //测试:选择排序法2    //chooseSort2(arr , 6);    //测试:快速排序    //fastSort(arr , 0 , 5);    //测试:归并排序法    mergeSort(arr , arr , 0 , 5);    cout << "排序后,数组元素:" << endl;    displayArray(arr , 6);    return 0;}//希尔排序法void shellSort(int arr[] , int length) {    int delta[3] = {5, 3 ,1};    int i = 0;    while(int dk = delta[i]) {  //遍历距离数        for(int k = delta[i]; k < length; k++) {            if(arr[k] < arr[k-dk]) {  //比较相距dk的两个元素大小                int t = arr[k] , j;   //记录要插入的元素值                for(j = k-dk; j >= 0 && arr[j]>arr[j+dk]; j=j-dk) {  //遍历k-dk前面所有相距dk的元素,决定插入的位置                    arr[j+dk] = arr[j];   //移动元素                }                arr[j+dk] = t;   //癣元素插入到正确的位置            }        }        i++;    }}//冒泡排序法1void popperSort(int arr[] , int length) {    int temp;    for(int i = 0; i < length - 1; i++) {  //记录冒泡排序要遍历数组的次数        for(int j= length-1; j > i; j--) {  //倒序遍历数组元素            if(arr[j] < arr[j-1]) {                temp = arr[j];                arr[j] = arr[j-1];                arr[j-1] = temp;            }        }    }}//冒泡排序法2void popperSort2(int arr[] , int length) {    int temp;    for(int i = 0; i < length-1; i++) {   //记录冒泡排序要遍历数组的次数        for(int j = 0; j < length-i+1; j++) {  //正序遍历数组元素            if(arr[j] > arr[j+1]) {                temp = arr[j];                arr[j] = arr[j+1];                arr[j+1] = temp;            }        }    }}//选择排序法1void chooseSort(int arr[] , int length) {    int k , temp;    for(int i = 0; i < length-1; i++) {  //正序遍历数组        k = i;   //记录最小值的地址        for(int j = k+1; j < length; j++) {  //遍历i以后的所有数组元素            if(arr[k] > arr[j]) {                k = j;            }        }        temp = arr[k];        arr[k] = arr[i];        arr[i] = temp;    }}//选择排序法2void chooseSort2(int arr[] , int length) {    int k , temp;    for(int i = length-1; i > 0; i--) {  //倒序序遍历数组        k = i;   //记录最大值的地址        for(int j = k-1; j >= 0; j--) {  //遍历i以后的所有数组元素            if(arr[k] < arr[j]) {                k = j;            }        }        temp = arr[k];        arr[k] = arr[i];        arr[i] = temp;    }}//插入排序法void insertSort(int arr[] , int length) {    int temp , index = 0;   //temp记录要插入的元素值,index记录要插入的位置    for(int i = 1; i < length; i++) {  //遍历第二个及以后的所有元素        temp = arr[i];        if(temp < arr[i-1]) {  //如果当前元素值小于它前一个元素,直接检查下一个元素            continue;        }        for(int j = 0; j < i; j++) {  //在i以前找出插入的位置            if(arr[j] <= temp) {                index = j;                break;            }        }        for(int k = i; k >= index; k--) {   //移动插入位置到i的所有元素            arr[k] = arr[k-1];        }        arr[index] = temp;   //插入元素到相应的位置    }}//插入排序法2void insertSort2(int arr[] , int length) {    int temp , index = length-1;   //temp记录要插入的元素值,index记录要插入的位置    for(int i = length-2; i >= 0; i--) {  //遍历倒数第二个及以前的所有元素        temp = arr[i];        if(temp < arr[i+1]) {  //如果当前元素值小于它后一个元素,直接检查下一个元素            continue;        }        for(int j = length-1; j > i; j--) {  //在i以后找出插入的位置            if(arr[j] <= temp) {                index = j;                break;            }        }        for(int k = i+1; k <= index; k++) {   //移动i+1到index的所有元素            arr[k-1] = arr[k];        }        arr[index] = temp;   //插入元素到相应的位置    }}//快速排序void fastSort(int arr[] , int low , int high) {    if(low < high) {        int i = low , j = high;  //使用i,j遍历整个数组区域        int prvilot = arr[low];  //记录中间值        //将数组分为两个段,一个段所有值都小于另外一个段        while(j > i) {            while(j > i && arr[j] >= prvilot) {                j--;            }            if(j > i)                arr[i++] = arr[j];            while(j > i && arr[i] <= prvilot) {                i++;            }            if(j > i)                arr[j--] = arr[i];        }        arr[i] = prvilot;  //将中间值插入到空缺的位置        //递归调用函数,对子段进行快速排序        fastSort(arr , low , i);        fastSort(arr , i+1 , high);    }}//合并两个有序数组void merge(int a1[] , int a2[] , int low , int middle , int high) {    int i , j;    for(i = low , j = middle+1; low<=middle && j <= high; i++) {        if(a1[low] < a1[j]) {            a2[i] = a1[low++];        } else {            a2[i] = a1[j++];        }    }    for(;low <= middle; i++) {        a2[i] = a1[low++];    }    for(;j <= high; i++) {        a2[i] = a1[j++];    }}//归并排序void mergeSort(int a1[] , int a2[] , int low , int high) {    int m , *temp;    if(low == high) {        a2[low] = a1[low];    } else {        temp = (int *)malloc((high - low + 1) * sizeof(int));        m = (high + low) / 2;        mergeSort(a1 , temp , low , m);        mergeSort(a1 , temp , m + 1 , high);        merge(temp , a2 , low , m, high);        free(temp);    }}void displayArray(int arr[] , int length) {    for(int i = 0; i < length; i++) {        cout << arr[i] << "  ";    }    cout << endl;}
原创粉丝点击