[面試算法] 排序算法

快速排序

int partion(vector<int> &nums, int begin, int end){
	int x = nums[end], i = begin - 1;
	for (int j = begin; j < end; j++){
		if (nums[j] <= x){
			swap(nums[++i], nums[j]);
		}
	}
	swap(nums[++i], nums[end]);
	return i;
}

void quickSort(vector<int> &nums,int begin,int end){
	if (begin < end){
		int q = partion(nums, begin, end);
		quickSort(nums, begin, q - 1);
		quickSort(nums, q + 1, end);
	}
}

歸併排序

void merge(vector<int> &nums, int begin, int end, int mid){
	vector<int> temp(end - begin + 1);
	int i = begin, j = mid + 1, k = 0;
	while (i <= mid && j <= end){
		if (nums[i] <= nums[j]){
			temp[k++] = nums[i++];
		}
		else{
			temp[k++] = nums[j++];
		}
	}
	while (i <= mid){
		temp[k++] = nums[i++];
	}
	while (j <= end){
		temp[k++] = nums[j++];
	}
	for (int x = begin; x <= end; x++){
		nums[x] = temp[x - begin];
	}
}


void mergeSort(vector<int> &nums, int begin, int end){
	if (begin < end){
		int mid = (begin + end) >> 1;
		mergeSort(nums, begin, mid);
		mergeSort(nums, mid + 1, end);
		merge(nums, begin, end, mid);
	}
}

堆排序

void HeapAdjust(vector<int> &nums, int start, int end){
	int large = start, l = start * 2 + 1, r = start * 2 + 2;
	if (l<end && nums[l]>nums[large]) large = l;
	if (r<end && nums[r]>nums[large]) large = r;
	if (large != start){
		swap(nums[start], nums[large]);
		HeapAdjust(nums, large, end);
	}
}

void HeapSort(vector<int> &nums){
	int len = nums.size();
	for (int i = len / 2 - 1; i >= 0; i--)
		HeapAdjust(nums, i, len);
	for (int i = len - 1; i > 0; i--){
		swap(nums[i], nums[0]);
		HeapAdjust(nums, 0, i);
	}
}

插入排序

void insertSort(vector<int> &nums) {
    if (nums.size() < 2)
        return;
    for (int i = 1; i < nums.size(); i++) {
        int x = nums[i];
        for (int j = i - 1; j >= 0; j--) {
            if (x <= nums[j])
                nums[j + 1] = nums[j];
            else {
                nums[j + 1] = x;
                break;
            }
        }
    }
}

GitHub-Leetcode:https://github.com/wenwu313/LeetCode

發佈了129 篇原創文章 · 獲贊 52 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章