• 《数据结构与算法分析》引论:选择问题实现


    在《数据结构与算法分析——C语言描写叙述》的引论中有提到一个问题:

    设有一组N个数而要确定当中第k个最大者。

    被称为选择问题(selection problem)。

    后面有提到两种算法,以下是我依据描写叙述。写的代码:

    /*
     * 来源:《数据结构与算法分析》引论
     * 题目:选择性问题。从N个数中找出第k大者
     * 
     * */
    #include <stdio.h>
    #include <stdlib.h>
    
    
    /*
    * 输出数组
    * */
    void printfArray(int arr[], int n) {
    	int i = 0;
    	for (i = 0; i < n; ++i ) {
    		printf("%d ", arr[i]);
    	}
    	printf("
    ");
    }
    
    
    /*
     * 冒泡排序
     * */
    void bubble_sort(int arr[], int n) {
    	int i = 0;
    	int j = 0;
    	for (i = 0; i < n - 1; ++i) {
    		for (j = 0; j < n - 1 - i; ++j) {
    			if (arr[j] < arr[j + 1]) {
    				int tmp = arr[j];
    				arr[j] = arr[j + 1];
    				arr[j + 1] = tmp;
    			}
    		}
    	}
    }
    
    
    /*
     * 对数组进行排序,返回第k-1位置上的元素即为第k大者
     * */
    int getMaxK1(int arr[], int n, int k) {
    	// 拷贝数组,不要改变出入參数的值
    	int i = 0;
    	int* tmp = malloc(sizeof(int) * 10); 
    	for (i = 0; i < n; ++i) { 
    		tmp[i] = arr[i];	
    	}
    	
    	bubble_sort(tmp, n);
    	int ret = tmp[k - 1];
    	free(tmp);
    	tmp = NULL;
    
    
    	return ret;	
    }
    
    
    /*
     * 1 读入数组前k个元素并排序
     * 2 将余下的元素依次与第k-1个元素对照,小则忽略
     * 3 大则插入数组的合适位置。同一时候挤出最后一个元素
     * 4 然会第k-1位置上的元素, 排序
     * */
    int getMaxK2(int arr[], int n, int k) {
    	int i = 0;
    	int* tmp = malloc(sizeof(int) * k);
    	for (i = 0; i < k; ++i) {
    		tmp[i] = arr[i];
    	}
    	bubble_sort(tmp, k);
    	
    	int j = 0;
    	for (j = i; j < n; ++j) {
    		if (arr[j] > tmp[k - 1]) {
    			tmp[k - 1] = arr[j];
    			bubble_sort(tmp, k);
    		}	
    	}
    
    
    	printfArray(tmp, k);
    	int ret = tmp[k - 1];
    	free(tmp);
    	tmp = NULL;
    
    
    	return ret;
    }
    
    
    int main() {
    	int arr[] = {9, 7, 0, 6, 1, 2, 4, 3, 5, 8};// 10个数:0-9
    	int k = 3;// 找第3大者
    	printf("%d
    ", getMaxK1(arr, 10, k)); // 输出7
    	printf("%d
    ", getMaxK2(arr, 10, k)); // 输出7
    
    
    	return 0;
    }





  • 相关阅读:
    Gogh-位图编纂次序
    Skype 1.4 for Linux 掉掉更新
    Jokosher 0.9
    [推荐]实用网址大全
    创建异形窗口[2]
    创建异形窗口[3]
    动态列表
    给系统菜单添加菜单项
    演示控件的 Anchors 属性
    使用 WM_NCHITTEST 消息判断鼠标所在窗口的部位
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6884174.html
Copyright © 2020-2023  润新知