排序算法

2020-08-23  本文已影响0人  const_qiu

十大经典排序算法
1.选择排序

void SelectSort(vector<int>& nums) {
    int length = nums.size();
    for (int i = 0; i < length-1; i++) {
        int min_index = i;
        for (int j = i + 1; j < length; j++) {
            if (nums[j] < nums[min_index])
                min_index = j;

        }
        swap(nums[i],nums[min_index]);
    }
    return;
 }

2.插入排序

void InsertSort(vector<int>& nums) {
    int length = nums.size();
    for (int i = 1; i < length; i++) {
        int preIndex = i - 1;
        int cur = nums[i];
        while (preIndex>=0&& nums[preIndex]>cur)
        {
            nums[preIndex + 1] = nums[preIndex];
            preIndex--;
        }
        nums[preIndex + 1] = cur;

    }

    return;
 }

3.冒泡排序
循环嵌套,每次查看相邻的元素,如果逆序则交换。(实际中基本不会使用)

void BubbleSort(vector<int>&a) {
    int length = a.size();
    for (int i = 0; i < length; i++) {
        bool flag = false;
        for (int j = length - 1; j > i; j--) {
            if (a[j - 1] > a[j]) {//当前元素与前驱比较,若逆序,则交换
                swap(a[j-1],a[j]);
                flag = true;
            }
            
        }
        if (flag == false) {

            return;
        }

    }
    return;
}
  1. 快速排序
    数组取pivot标杆,小于pivot的放在左边,大于pivot的放右边,然后继续对左边的和右边的子数组进行快排,以达到整个数组有序。
int random_partition(vector<int>& nums, int idx_l, int idx_r) {

    int random_pivot_index = rand() % (idx_r - idx_l + 1) + idx_l;
    int pivot = nums[random_pivot_index];
    swap(nums[random_pivot_index],nums[idx_r]);
       
    int i = idx_l - 1; //统计有多少个小于pivit的元素,类似于双指针思想(快慢指针),i指向比pivot小的最后一个位置,
    for (int j = idx_l; j < idx_r; j++) {
        if (nums[j] < pivot) {
            i++;
            swap(nums[j],nums[i]);
        }
    }
    int idx_pivot = i + 1;
    swap(nums[idx_pivot],nums[idx_r]);
    return idx_pivot;

}

void random_quicksort(vector<int>& nums,int idx_l,int idx_r) {
    if (idx_l < idx_r) {

        int pivot_index = random_partition(nums,idx_l,idx_r);
        random_quicksort(nums,idx_l, pivot_index -1);
        random_quicksort(nums, pivot_index +1,idx_r);
    }
}

int main() {
    
    vector<int> a = { 5,4,3,2,1,4,5,6 };
    int l = 0;
    int r = a.size() - 1;
    random_quicksort(a,l,r);
    for (int it : a) {
        cout<<it<<endl;
    }


    
    return 0;
}

5 归并排序

void merge(vector<int>&nums, int left, int mid, int right) {
    vector<int> tmp(right - left + 1);
    int i = left, j = mid + 1, k = 0;
    while (i <= mid && j <= right) {
        tmp[k++] = nums[i] < nums[j] ? nums[i++] : nums[j++];
    }
    while (i <= mid)  tmp[k++] = nums[i++];
    while (j <= right) tmp[k++] = nums[j++];
    for (i = left, k = 0; i <= right;) nums[i++] = tmp[k++];
}
void  mergeSort(vector<int>& nums, int left, int right) {

    if (left >= right)  return;
        int mid = left + ((right - left)>>1);
        mergeSort(nums, left, mid);
        mergeSort(nums, mid + 1, right);
        merge(nums, left, mid, right);
    
    
}

int main() {
    
    vector<int> a = { 5,4,3,2,1,4,5,6 };
    int l = 0;
    int r = a.size() - 1;
    mergeSort(a,l,r);
    for (int it : a) {
        cout<<it<<endl;
    }


    
    return 0;
}

6 堆排序

void heapify(vector<int> &array, int length, int i) {  //向下调整堆
    int left = 2 * i + 1, right = 2 * i + 2;
    int largest = i;

    if (left < length && array[left] > array[largest]) {
        largest = left;
    }
    if (right < length && array[right] > array[largest]) {
        largest = right;
    }

    if (largest != i) {
        int temp = array[i]; array[i] = array[largest]; array[largest] = temp;
        heapify(array, length, largest);
    }


    return;
}

void heapSort(vector<int> &array) {
    if (array.size() == 0) return;

    int length = array.size();//初始化堆
    for (int i = length / 2 - 1; i >= 0; i--)
        heapify(array, length, i);

    for (int i = length - 1; i >= 0; i--) {
        int temp = array[0]; array[0] = array[i]; array[i] = temp;
        heapify(array, i, 0);
    }

    return;

}
int main() {

    vector<int> nums = {2,3,6,3,87,4};
    heapSort(nums);
    for (int a : nums) {
        cout << a << endl;
    }
    
    
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读