排序算法总结及实现

来源:互联网 发布:湖北师范大学金数据 编辑:程序博客网 时间:2024/06/02 03:35

经典排序算法及其实现


冒泡排序

从后向前遍历,如果当前元素比前一位的元素小,就将其互换,这样一遍下来,最小的元素会被换到第一位,再从后向前进行第二遍遍历。。。

//冒泡void bubbleSort(vector<int>& array) {    int size = array.size();    for (int i = 0; i < size; i++)    {        for (int j = size-1; j > i; j--)        {            if (array[j] < array[j - 1]){                int temp = array[j];                array[j] = array[j - 1];                array[j - 1] = temp;            }        }    }    return;}

选择排序

顾名思义,每次都选择当前剩下元素中最小的一个。
选择最小的元素,存入A[0],再在剩下的元素中,选择第二小的,存入A[1]。。。

//选择void selectSort(vector<int>& array) {    int size = array.size();    for (int i = 0; i < size; i++)    {        int minIndex = i;        for (int j = i+1; j < size; j++)        {            minIndex = array[minIndex] < array[j] ? minIndex : j;        }        int temp = array[minIndex];        array[minIndex] = array[i];        array[i] = temp;    }    return;}

插入排序

每次都将一个元素插入一个已排好序的数组中。

//插入void insertSort(vector<int>& array) {    int size = array.size();    for (int i = 1; i < size; i++)    {        //若需要插入的元素比数组中所有元素都小,该元素会插在A[0]的位置,即-1之后        int index = -1;        int temp = array[i];        //为当前元素在已排好序的数组中找到合适的位置,即插在index之后        //从后向前找,只需要找到第一个小于等于当前元素的index        for (int j = i - 1; j >= 0; j--)        {            if (array[j] <= temp)            {                index = j;                break;            }        }        //将index之后的元素都后移一位        for (int k = i; k > index+1; k--)        {            array[k] = array[k-1];        }        //设置插入的元素        array[index + 1] = temp;    }    return;}

快速排序

以第一个元素x为界限,将数组分成两个部分,x之前的都比它小,x之后的都比它大,对两部分分别递归地进行快排。

//划分算法,返回A[low]的新位置//in placeint split(vector<int>& array,int low,int high) {    int i = low;    int x = array[i];    //index=low的元素作为哨兵    //做一次遍历,[low+1,i]的都比x小    for (int j = i+1; j <= high; j++)    {        if (array[j] <= x)        {            i++;    //找最近一个比x大的元素,交换位置            if (i != j)            {                int temp = array[j];                array[j] = array[i];                array[i] = temp;            }        }    }    //最后需要交换i和low的位置    int temp = array[i];    array[i] = array[low];    array[low] = temp;    return i;}//快排void quickSort(vector<int>& array,int low,int high) {    if (low < high)    {        int w = split(array,low,high);        quickSort(array, low, w - 1);        quickSort(array, w + 1, high);    }    return;}

归并排序

将数组从中间一分为二,对两部分分别进行排序,再将其合并,排序的方法可以任选,也可以使用归并排序进行递归。

//将数组array[low,mid],array[mid+1,high]合并void merge(vector<int>& array, int low, int mid, int high) {    vector<int> result; //辅助数组    int s = low;    int t = mid + 1;        //两个指针    while (s <= mid && t <= high)    {        if (array[s] <= array[t])        {            result.push_back(array[s]);            s++;        }        else{            result.push_back(array[t]);            t++;        }    }    //若array[low,mid]或者array[mid+1,high]有剩余,将剩下的全部复制到result数组中    if (s <= mid)    {        for (int i = s; i <= mid; i++)        {            result.push_back(array[i]);        }    }    if (t <= high)    {        for (int i = t; i <= high; i++)        {            result.push_back(array[i]);        }    }    //将辅助数组中的值存入原始数组    int k = 0;    for (int i = low; i <= high; i++)    {        array[i] = result[k];        k++;    }    return;}//归并void mergeSort(vector<int>& array, int low, int high) {    if (low < high)    {        int mid = (low + high) / 2;        mergeSort(array, low, mid);        mergeSort(array, mid + 1, high);        merge(array, low, mid, high);    }    return;}

完整代码

#include <iostream>#include <vector>using namespace std;//冒泡void bubbleSort(vector<int>& array) {    int size = array.size();    for (int i = 0; i < size; i++)    {        for (int j = size-1; j > i; j--)        {            if (array[j] < array[j - 1]){                int temp = array[j];                array[j] = array[j - 1];                array[j - 1] = temp;            }        }    }    return;}//选择//找到最小的元素,存在A[0]中,再从剩下的里面找到第二小的,存在A[1]中...void selectSort(vector<int>& array) {    int size = array.size();    for (int i = 0; i < size; i++)    {        int minIndex = i;        for (int j = i+1; j < size; j++)        {            minIndex = array[minIndex] < array[j] ? minIndex : j;        }        int temp = array[minIndex];        array[minIndex] = array[i];        array[i] = temp;    }    return;}//插入//每次将一个元素插入一个已排好序的数组中void insertSort(vector<int>& array) {    int size = array.size();    for (int i = 1; i < size; i++)    {        int index = -1;        int temp = array[i];        //为当前元素在已排好序的数组中找到合适的位置,即插在index之后        for (int j = i - 1; j >= 0; j--)        {            if (array[j] <= temp)            {                index = j;                break;            }        }        //将index之后的元素都后移一位        for (int k = i; k > index+1; k--)        {            array[k] = array[k-1];        }        //设置插入的元素        array[index + 1] = temp;    }    return;}//将数组分成两部分,比哨兵x小的都在x之前,比x大的都在x之后//in placeint split(vector<int>& array,int low,int high) {    int i = low;    int x = array[i];    for (int j = i+1; j <= high; j++)    {        if (array[j] <= x)        {            i++;            if (i != j)            {                int temp = array[j];                array[j] = array[i];                array[i] = temp;            }        }    }    int temp = array[i];    array[i] = array[low];    array[low] = temp;    return i;}//快排//将数组split成两部分,对这两部分分别进行递归地快排void quickSort(vector<int>& array,int low,int high) {    if (low < high)    {        int w = split(array,low,high);        quickSort(array, low, w - 1);        quickSort(array, w + 1, high);    }    return;}//将数组array[low,mid],array[mid+1,high]合并void merge(vector<int>& array, int low, int mid, int high) {    vector<int> result; //辅助数组    int s = low;    int t = mid + 1;        //两个指针    while (s <= mid && t <= high)    {        if (array[s] <= array[t])        {            result.push_back(array[s]);            s++;        }        else{            result.push_back(array[t]);            t++;        }    }    //若array[low,mid]或者array[mid+1,high]有剩余,将剩下的全部复制到result数组中    if (s <= mid)    {        for (int i = s; i <= mid; i++)        {            result.push_back(array[i]);        }    }    if (t <= high)    {        for (int i = t; i <= high; i++)        {            result.push_back(array[i]);        }    }    //将辅助数组中的值存入原始数组    int k = 0;    for (int i = low; i <= high; i++)    {        array[i] = result[k];        k++;    }    return;}//归并排序//将数组从中间一分为二,对每个部分分别进行排序,再将排好序的两部分合并,排序方法同样可以使用归并排序进行递归void mergeSort(vector<int>& array, int low, int high) {    if (low < high)    {        int mid = (low + high) / 2;        mergeSort(array, low, mid);        mergeSort(array, mid + 1, high);        merge(array, low, mid, high);    }    return;}void chooseSortType(int sortType, vector<int>& array) {    switch (sortType)    {    case(1) :        cout << "Bubble Sort:" << endl;        bubbleSort(array);        break;    case(2) :        cout << "Select Sort:" << endl;        selectSort(array);        break;    case(3) :        cout << "Insert Sort:" << endl;        insertSort(array);        break;    case(4) :        cout << "Quick Sort:" << endl;        quickSort(array, 0, array.size()-1);        break;    case(5) :        cout << "Merge Sort:" << endl;        mergeSort(array, 0, array.size() - 1);        break;    default:        break;    }}void printArray(vector<int> array){    int size = array.size();    for (int i = 0; i < size; i++)    {        cout << array[i] << " ";    }}int main(){    vector<int> array;    array.push_back(6);    array.push_back(6);    array.push_back(7);    array.push_back(2);    array.push_back(5);    array.push_back(3);    array.push_back(4);    array.push_back(1);    array.push_back(12);    array.push_back(8);    array.push_back(9);    chooseSortType(5,array);    printArray(array);    return 0;}
0 0
原创粉丝点击