程序员

sort排序算法大总结

2018-12-19  本文已影响0人  Ariana不会哭

参考网站:http://www.runoob.com/w3cnote/sort-algorithm-summary.html

冒泡排序:babble sort O(n^2)

int* bubbleSort(int a[], int length)
{
    int temp;
    for (int i = 0; i < length-1; i++)
    {
        for (int j = 0; j < length-i-1; j++)
        {
            if (a[j]>a[j+1])
            {
                temp = a[j + 1];
                a[j + 1] = a[j];
                a[j] = temp;
            }
        }
    }
    return a;
}

选择排序:selection sort O(n^2)

插入排序:babble sort O(n^2)

int* insertSort(int a[], int length)
{
    if (length <= 0 ||a==NULL)
    {
        cout << "wrong input" << endl;
        return NULL;
    }
    else if (length == 1)
    {
        return a;
    }
    else
    {
        int j,i,temp;
        for (i = 1; i < length; i++)
        {
            temp = a[i];
            
            for (j = i-1; j >=0&&a[j]>temp; j--)
            {
                a[j+1] = a[j];
            }
            a[j + 1] = temp;

        }
    }
    return a;
}

希尔排序:Shell sort O(n^1.5)


快速排序:quick sort O(N*logN)

//快速排序
int partition(vector<int>& nums, int low, int high) {
    int start = nums[low];
    while (low < high) {
        while (low<high&& nums[high]>start)
            high--;
        if (low < high) {
            swap(nums[low], nums[high]);
            low++;
        }
        while (low < high&&nums[low] < start)
            low++;
        if (low < high) {
            swap(nums[low], nums[high]);
            high--;
        }
    }
    nums[low] = start;
    return low;
}
void Quick(vector<int>& nums, int low, int high) {
    if (low >= high)
        return;
    int idx = partition(nums,low,high);
    Quick(nums, low, idx - 1);
    Quick(nums, idx + 1, high);
}
vector<int> QS(vector<int>& nums, int low, int high) {
    if (nums.size() == 0)
        return {};
    Quick(nums, low, high);
    return nums;
}

归并排序:Merge sort O(N*logN)

//mergeSort
void Merge(vector<int>& nums, int low, int high) {
    int mid = (low + high) / 2;
    vector<int> left(mid+1), right(high+1);
    for (int i = low; i <= mid; i++)
        left[i]=nums[i];
    for (int i = mid + 1; i <= high; i++)
        right[i]=nums[i];

    int i = low, j = mid+1, idx = low;
    while (i <= mid && j<=high) {//right-->j
        if (right[j]<left[i]) {
            nums[idx++] = right[j++];
        }
        else {
            nums[idx++] = left[i++];
        }
    }
    while (i <= mid) {
        nums[idx++] = left[i++];
    }
    while (j<=high) {
        nums[idx++] = right[j++];
    }
}
void MergeS(vector<int>& nums, int low, int high) {
    if (low >= high)
        return;
    int mid = (low + high) / 2;

    MergeS(nums, low, mid);
    MergeS(nums, mid + 1, high);
    Merge(nums, low, high);
}
vector<int> MS(vector<int>& nums, int low, int high) {
    if (nums.size() == 0)
        return {};
    MergeS(nums, low, high);
    return nums;
}

堆排序:Heap sort O(N*logN)

基数排序:babble sort O(n+r)

上一篇 下一篇

猜你喜欢

热点阅读