zoukankan      html  css  js  c++  java
  • 第2章 算法基础(合并排序,逆序对)

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #include<string.h>
    #define MAXINT (1<<30)
    void InsertSort(int *a, int n)
    {
    	int tmp, j;
    	for (int i = 1; i < n; ++i){
    		tmp = a[i];
    		j = i - 1;
    		while (j >= 0 && a[j]>tmp){
    			a[j + 1] = a[j];
    			--j;
    		}
    		a[j + 1] = tmp;
    	}
    }
    void merge(int *a, int p, int q, int r)
    {
    	int n1 = q - p + 1;
    	int n2 = r - q;
    	int *L = (int*)malloc((n1 + 1)*sizeof(int));
    	int *R = (int*)malloc((n2 + 1)*sizeof(int));
    	for (int i = 0; i < n1; ++i)
    		L[i] = a[p + i];
    	for (int i = 0; i < n2; ++i)
    		R[i] = a[q + 1 + i];
    	L[n1] = R[n2] = MAXINT;
    	int i, j;
    	i = j = 0;
    	for (int k = p; k <= r; ++k){
    		if (L[i] < R[j]){
    			a[k] = L[i];
    			++i;
    		}
    		else{
    			a[k] = R[j];
    			++j;
    		}
    	}
    	free(L);
    	free(R);
    }
    void mergeSort(int *a, int p, int r)
    {
    	if (p < r){
    		int q = (r + p) / 2;
    		mergeSort(a, p, q);
    		mergeSort(a, q + 1, r);
    		merge(a, p, q, r);
    	}
    }
    
    void printArray(int *a, int n)
    {
    	for (int i = 0; i < n; ++i)
    		printf("%d	", a[i]);
    	printf("
    ");
    }
    //逆序对 n^2
    int inversion(int *a, int n)
    {
    	int count = 0;
    	for (int i = 0; i < n - 1; ++i)
    		for (int j = i + 1; j < n; ++j)
    			if (a[i]>a[j]) ++count;
    	return count;
    }
    
    //逆序对 nlgn
    int InversionMerge(int *a, int p, int q, int r)
    {
    	int n1 = q - p + 1;
    	int n2 = r - q;
    	int *L = (int*)malloc((n1 + 1)*sizeof(int));
    	int *R = (int*)malloc((n2 + 1)*sizeof(int));
    	for (int i = 0; i < n1; ++i)
    		L[i] = a[p + i];
    	for (int i = 0; i < n2; ++i)
    		R[i] = a[q + 1 + i];
    	L[n1] = R[n2] = MAXINT;
    	int i, j, count;
    	i = j = count = 0;
    	for (int k = p; k <= r; ++k){
    		if (L[i] <= R[j]){
    			a[k] = L[i];
    			++i;
    		}
    		else{
    			a[k] = R[j];
    			++j;
    			count += n1 - i;	//L中有 n1-i 个大于 R[j] 的项,此操作会使数组的逆序对减少 n1-i 个
    		}
    	}
    	free(L);
    	free(R);
    	return count;
    }
    int InversionMergeSort(int *a, int p, int r)
    {
    	int count = 0;
    	if (p < r){
    		int q = (r + p) / 2;
    		count += InversionMergeSort(a, p, q) + InversionMergeSort(a, q + 1, r) + InversionMerge(a, p, q, r);
    	}
    	return count;
    }
    int main()
    {
    	srand(time(NULL));
    	const int cnt = 10;
    	int a[cnt];
    	for (int i = 0; i < cnt; ++i)
    		a[i] = rand() % 100;
    	//mergeSort(a, 0,cnt-1);
    	for (int i = 0; i < cnt; ++i)
    		printf("%d	", a[i]);
    	printf("
    ");
    	printf("%d
    ", inversion(a, cnt));
    	printf("%d
    ", InversionMergeSort(a, 0, cnt - 1));
    
    }
    

      

  • 相关阅读:
    listctrl中的cell如何支持被复制
    Can not issue data manipulation statements with executeQuery()的解决方案
    Jenkins工具学习(一)
    如何对图片进行测试
    WebDriver常用的api
    Cannot get a STRING value from a NUMERIC cell问题的解决办法
    Eclipse中安装springmvc插件
    Tomcat 的端口被占用的解决办法
    pyCharm最新激活码(2018激活码)
    Error: Error occured while starting App. Original error: Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity
  • 原文地址:https://www.cnblogs.com/jokoz/p/4692292.html
Copyright © 2011-2022 走看看