手写排序算法(二)

102 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

在这里插入图片描述

6、快速排序

void quicksort(vector<int> &q, int l, int r) {
	if (l >= r)
		return;
	int i = l - 1, j = r + 1, x = q[l + rand() % (r - l + 1)];
	while (i < j) {
		do j--; while (q[j] > x);
		do i++; while (q[i] < x);
		if (i < j)
			swap(q[i], q[j]);
		else {
			quicksort(q, l, j);
			quicksort(q, j + 1, r);
		}
	}
}

在这里插入图片描述

7、堆排序

void initialHeap(vector<int> &nums)
{
	int parent = nums.size() / 2;
	for (int i = parent - 1; i >= 0; i--)
	{
		int aparent = i + 1;
		int maxchild = i + 1;
		while (aparent <= nums.size() / 2)
		{
			
			if (nums[aparent * 2 - 1] > nums[aparent - 1])
			{
				maxchild = aparent * 2 ;
			}
			if (aparent * 2 + 1 <= nums.size() && nums[aparent * 2 + 1 - 1] > nums[aparent * 2 - 1] && nums[aparent * 2] > nums[aparent - 1])
			{
				maxchild = aparent * 2 + 1 ;
			}
			if (maxchild != aparent)
			{
				swap(nums[aparent - 1], nums[maxchild - 1]);
				aparent = maxchild;
				maxchild = aparent;
			}
			else
			{
				break;
			}

		}
	}
}

void recover(vector<int> &nums, int length)
{
	int parent = 1;
	int maxchild = parent;
	while (parent <= length / 2)
	{
		if (nums[parent * 2 - 1] > nums[parent - 1])
		{
			maxchild = parent * 2;
		}
		if (parent * 2 + 1 <= length && nums[parent * 2] > nums[parent * 2 - 1] && nums[parent * 2] > nums[parent - 1])
		{
			maxchild = parent * 2 + 1;
		}
		if (maxchild != parent)
		{
			swap(nums[parent - 1], nums[maxchild - 1]);
			parent = maxchild;
			maxchild = parent;
		}
		else
		{
			break;
		}
	}
}


void heapSort(vector<int> &nums)//堆排序进入的函数
{
	initialHeap(nums);//首先构造一个堆
	for (int i = nums.size() - 1; i >= 0; i--)
	{
		swap(nums[0], nums[i]);//不断将当前最大值放到对应的位置
		recover(nums, i);//调整数组使其继续成为堆
	}
}

int main()
{
	vector<int> nums = {21,43,11,3,54,12,87,55,23,5};
	heapSort(nums);
	for (int i = 0; i < nums.size(); i++)
	{
		cout << nums[i]<<" ";
	}
}

在这里插入图片描述

8、基数排序


int get(int x, int i){
    while(i--)
        x /= 10;
    return x % 10;
}
 
void radixSort(vector<int> &q, int n){
    vector<vector<int>> cnt(10);
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 10; j++)
            cnt[j].clear();
        for(int j = 0; j < n; j++)
            cnt[get(q[j], i)].push_back(q[j]);
        for(int j = 0, k = 0; j < 10; j++){
            for(int x : cnt[j])
                q[k++] = x;
        }
    }
}

在这里插入图片描述