• 快排的两种写法


    快排方法一:



    附:全代码实现

    #include<iostream>
    #include<assert.h>
    using namespace std;
    
    int OnceSort(int *a, int left, int right)
    {
    	int i = 0;
    	int middle = right;
    	right -= 1;
    
    	while (left < right)
    	{
    		//left找大于middle的数
    		while (left < right && *(a + left) <= *(a + middle))
    			left++;
    
    		//right找小于middle的数
    		while (left < right && *(a + right) > *(a + middle))
    			right--;
    
    		if (left < right)
    		{
    			swap(*(a + left), *(a + right));
    		}
    		else
    		{
    			break;
    		}
    	}
    	if (*(a + left) < *(a + middle))
    	{
    		i = left + 1;
    	}
    	else
    	{
    		i = left;
    	}
    	while (i < middle)
    	{
    		swap(*(a + middle - 1), *(a + middle));
    		middle--;
    	}
    	return i;
    }
    
    void QuickSort(int* a, int left, int right)
    {
    	assert(a);
    	int middle = 0;
    	if (left < right)
    	{
    		middle = OnceSort(a, left, right);
    		QuickSort(a, left, middle - 1);
    		QuickSort(a, middle + 1, right);
    	}
    }
    
    int main()
    {
    //	int a[] = { 6, 5, 4, 1, 4, 2, 4, 3 };
    	int a[] = { 9, 9, 9, 7, 7, 7, 8, 8, 8, 3, 2, 1, 8, 6 };
    	QuickSort(a, 0, sizeof(a) / sizeof(a[0]) - 1);
    	return 0;
    }

    快排方法二:

    代码实现,下附:

    #include<iostream>
    using namespace std;
    
    int onceSort(int a[], int left, int right)
    {
    	int key = a[left];
    	while (left < right)
    	{
    		while (left < right && (*(a + right) >= key))
    		{
    			right--;
    		}
    		if (left < right && (*(a + right) < key))
    			swap(*(a + right), *(a + left));
    		while (left < right && (*(a + left) < key))
    		{
    			left++;
    		}
    		if (left < right && (*(a + left) >= key))
    			swap(*(a + left), *(a + right));
    	}
    	a[left] = key;
    	return left;
    }
    
    void QuickSort(int a[], int left, int right)
    {
    	int middle = 0;
    	if (left < right)
    	{
    		middle = onceSort(a, left, right);
    		QuickSort(a, left, middle - 1);
    		QuickSort(a, middle + 1, right);
    	}
    }
    
    int main()
    {
    	int a[] = {2,1,4,3,8,7,5,6,4,4,4,4,4};
    	QuickSort(a, 0, sizeof(a) / sizeof(a[0]) - 1);
    	return 0;
    }


  • 相关阅读:
    开更
    PKUSC2016
    Educational Codeforces Round 12 E Beautiful Subarrays
    省选过了,又开始更新了。。。
    我来试试视频功能
    [BZOJ4407]于神之怒加强版
    bzoj3998: [TJOI2015]弦论
    bzoj4569: [Scoi2016]萌萌哒
    2016-5-30模拟测试
    2016-5-26模拟测试
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6851869.html
Copyright © 2020-2023  润新知