• 快速选择


    快速选择

    快速选择其实是相当于快速排序和二分查找的结合

    平均情况O(n)

    static int[] array ;
            static void Main(string[] args)
            {
                array = new int[] { 21312, 43234, 5, 324, 543 } ;
    
    
                Console.WriteLine("{0}", quickselect(2, 0, 4));
                Console.ReadLine();
            }
    
            //  打印
            static int partition(int left_pointer,int right_pointer)
            {
                //总是取最右的值为轴
                int pivot_position = right_pointer;
                int pivot = array[pivot_position];
                right_pointer--;
                while (true)
                {
                    
                    while (array[left_pointer] < pivot)
                    {
                        left_pointer++;
                        if (left_pointer == pivot_position)
                        {
                            break;
                        }
                    }
                    while (right_pointer >= 0 && array[right_pointer] > pivot)
                    {
                        right_pointer--;
                        if (right_pointer == 0)
                        {
                            break;
                        }
                    }
                    if (left_pointer >= right_pointer)
                    {
                        break;
                    }
                    else
                    {
                        swap(left_pointer, right_pointer);
                    }
                }
                swap(left_pointer, pivot_position);
                return left_pointer;
            }
            static void swap(int pointer1,int pointer2)
            {
                int temp_value = array[pointer1];
                array[pointer1] = array[pointer2];
                array[pointer2] = temp_value;
            }
            static int quickselect(int kth_lower_value,int left_index,int right_index)
            {
                if (right_index - left_index <= 0)
                {
                    return array[left_index];
                }
                int pivot_position = partition(left_index, right_index);
                if (kth_lower_value < pivot_position)
                {
                    return quickselect(kth_lower_value, left_index, pivot_position - 1);
                }else if (kth_lower_value > pivot_position)
                {
                    return quickselect(kth_lower_value, pivot_position + 1, right_index);
                }
                else
                {
                    return array[pivot_position];
                }
            }
    
  • 相关阅读:
    对Postmaster 对 SIGQUIT 信号处理的理解
    kill bgwriter 的小实验
    我对 execl 的学习
    pid_t 数据类型
    我对bgwriter.c 与 guc 关系的初步理解
    对Linux 下 SIGUSR1 与 SIGUSR2 的理解
    向bgwriter 发送 SIGQUIT 的实验
    常用txt图标符号
    也做网页图标favicon.ico
    TakeColor颜色拾取工具
  • 原文地址:https://www.cnblogs.com/wei1349/p/13870230.html
Copyright © 2020-2023  润新知