• 第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));
    
    }
    

      

  • 相关阅读:
    js node 操作
    深入认识javascript中的eval函数
    连接到网页objectivec
    web.config的数据库连接字符串进行加密
    fontsize和font标签的size属性的区别
    js改变背景图片
    MS:Chart:Series 成員 饼图 文字Label 显示在饼外
    读取plist文件
    js判断undefined类型
    当用updatepanel和scriptmanager时,弹出框
  • 原文地址:https://www.cnblogs.com/jokoz/p/4692292.html
Copyright © 2020-2023  润新知