• 【算法】经典排序


    1.平均表现最优的快排

    • 时间复杂度O(NlogN)

    • 空间复杂度O(1)

    • 缺点:不是稳定的,会交换值相同的元素的位置

    void swap(int *a, int *b)
    {
    	if (a==NULL || b==NULL || a==b || *a=*b)
    		return;
    
    	int tmp = *a;
    	*a = *b;
    	*b = tmp;
    }
    
    int partition(int a[], int size, int left, int right)
    {
    	if (a==NULL || size<=0 || left>=right)
    		return -1;
    
    	int i = left;
    	int j = right+1;
    	int pivot = a[left];
    	while (i<j)
    	{
    		while (a[++i]<pivot) {
    			if (i==right)
    				break;
    		}
    		while (a[--j]>pivot) {
    			if (j==left)
    				break;
    		}
    
    		if (i>=j)
    			break;
    
    		swap(&a[i], &a[j]);
    	}
    
    	swap(&a[left], &a[j]);
    
    	return j;
    }
    
    void QSort(int a[], int size, int left, int right)
    {
    	if (size<=0 || left>=right)
    		return;
    
    	int pindex = partition(a, size, left, right);
    	QSort(a, size, left, pindex-1);
    	QSort(a, size, pindex+1, right);
    }
    
    void qsort(std::vector<int> &nums)
    {
    	int size = nums.size();
    	if (size<=1) return ;
    
    	QSort(&nums[0], size, 0, size-1);
    }
    

    2.稳定排序首选归并排序

    • 时间复杂度O(NlogN)

    • 空间复杂度O(N)

    • 缺点:空间复杂度相对较高,需要额外数组大小的空间

    void merge(int a[], int size, int tmp[], int left, int mid, int right)
    {
    	if (a==NULL || size<=0 || left>=right)
    		return	;
    
    	int i = left;
    	int j = mid+1;
    	int k = left;
    	while (i<=mid && j<=right)
    	{
    		if (a[i]<a[j])
    		{
    			tmp[k++] = a[i++];
    		} else {
    			tmp[k++] = a[j++];
    		}
    	}
    
    	while (i<=mid) tmp[k++] = a[i++];
    	while (j<=right) tmp[k++] = a[j++];
    
    	while (left<=right)
    	{
    		a[right] = tmp[right];
    		right--;
    	}
    }
    
    void MSort(int a[], int size, int tmp[], int left, int right)
    {
    	if (a==NULL || size<=0 || left>=right) return;
    
    	int mid = left + (right-left)/2;
    	MSort(a, size, tmp, left, mid);
    	MSort(a, size, tmp, mid+1, right);
    	merge(a, size, tmp, left, mid, right);
    }
    
    void mergeSort(std::vector<int> &nums)
    {
    	int size = nums.size();
    	if (size<=1) return	;
    
    	std::vector<int> tmp(size, 0);
    	MSort(&nums[0], size, tmp, 0, size-1);
    }
    
  • 相关阅读:
    不安装oracle客户端也可以使用pl/sql developer
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
    c语言第一次作业1
    C语言I博客作业04
    C语言I博客作业03
    C语言I博客作业02,
    ASP.NET url重写与图片防盗链 I
  • 原文地址:https://www.cnblogs.com/phillee/p/16050183.html
Copyright © 2020-2023  润新知