рдХреНрдпреЛрдВ рдЬрдВрдЧ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдмрди рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░!

рд╕реНрдХрд╛рд▓рд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рддреБрд░рдВрдд рдЗрд╕ рддрдереНрдп рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рдХрд┐ рд╕рд░рд▓рддрдо рддреНрд╡рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдзреАрдорд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рдорд╛рди рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реА рд╕рдордп, рдХреЛрдИ рднреА рд╡рд┐рд╡рд╛рдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЛрдб рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд, рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рддрд┐рд░реЛрдзреА рд╣реИред рд░рд╕реНрдЯ рдореЗрдВ рджреЛрдиреЛрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬреЗрдВ рдЦреЛрдЬреАрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХрдЯ рдХреЗ рддрд╣рдд рд╡рд┐рд╡рд░рдг, рдФрд░ рдпрд╣рд╛рдВ рдореИрдВ рдХреЗрд╡рд▓ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд┐рд╖реНрдХрд░реНрд╖ рджреВрдВрдЧрд╛:

  1. рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП - рдЬрдВрдЧ рд╕реЗ рд▓рд╛рдн рдХреЗрд╡рд▓ 20% рдерд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬреЗрд╡реАрдПрдо рдореВрд▓ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдХрд░реАрдм рдЖ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрдЪрд╛ рд╣реИред
  2. рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рд░рд╕реНрдЯ 4.5 рдЧреБрдирд╛ рддреЗрдЬ рд╣реЛ рдЧрдпрд╛, рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд 5.5 рдЧреБрдирд╛ рдХрдо рд╣реЛ рдЧрдИ, рдФрд░ рдПрдХ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рдмрдирд╛ рджрд┐рдпрд╛ (рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдХрдо рднрд┐рдиреНрдирддрд╛)ред рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдЬреЛ рддреЗрдЬ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
  3. рдбреЗрдЯрд╛ рдХреЗ рдПрдХрдорд╛рддреНрд░ рдорд╛рд▓рд┐рдХ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ (рдФрд░ рдХреЗрд╡рд▓ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕рдВрджрд░реНрдн) рд░рд╕реНрдЯ рдореЗрдВ рдЕрдкрдирд╛рдИ рдЧрдИ рдЕрд╡рдзрд╛рд░рдгрд╛, рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реЗ рдмрд╣реБрдд рдорд┐рд▓рддреА-рдЬреБрд▓рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрд▓реНрдЧреЛрд░рд┐рдердо, рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдФрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рдЧрднрдЧ рдХреЛрдИ рдкреБрдирд░реНрд▓реЗрдЦрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЕрдирд┐рд╡рд╛рд░реНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреЗ рд╣реИрдВред рд▓рд┐рдВрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди, рдЬреАрд╡рдирдХрд╛рд▓ рдЖрджрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдирд┐рд╖реНрдХрд░реНрд╖ - рдПрдлрдкреА рдХреЗ рд▓рд┐рдП рдЬрдВрдЧ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдЕрднреА рддрдХ рд╕реНрдХрд╛рд▓рд╛ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреА рд╣реИрдВред

рддреЛ, рдЖрдЗрдП рд╕реНрдХрд╛рд▓рд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ 2 рд╢реИрд▓рд┐рдпреЛрдВ рдореЗрдВ рддреНрд╡рд░рд┐рдд рдЫрдБрдЯрд╛рдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

рдЕрднреЗрджреНрдп рд░реВрдк рд╕реЗ - рд╣рдо рдПрдХ рд╣реА рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╡рд░реНрдмреЛрдЬрд╝ рдХреЛрдб рджреЗрдЦрддреЗ рд╣реИрдВ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдкреЛрд╕ рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдВрднрд╡рддрдГ рд╕реНрдореГрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдФрд░ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗред

def sort_imp(arr: Array[Double]) {
  def swap(i: Int, j: Int) {
    val t = arr(i)
    arr(i) = arr(j)
    arr(j) = t
  }

  def sort1(l: Int, r: Int) {
    val pivot = arr((l + r) / 2)
    var i = l
    var j = r
    while (i <= j) {
      while (arr(i) < pivot) i += 1
      while (arr(j) > pivot) j -= 1
      if (i <= j) {
        swap(i, j)
        i += 1
        j -= 1
      }
    }
    if (l < j) sort1(l, j)
    if (i < r) sort1(i, r)
  }

  if (arr.length > 1)
    sort1(0, arr.length - 1)
}

тАФ , , . , , (, GC).

def sort_fun(arr: Array[Double]): Array[Double] = {
  if (arr.length <= 1) 
    arr
  else {
    val pivot = arr(arr.length / 2)
    Array.concat(
      sort_fun(arr filter (pivot > _)),
      arr filter (pivot == _),
      sort_fun(arr filter (pivot < _))
    )
  }
}

($ sbt run) 10 . :

  • тАФ 2.5
  • тАФ 40

, java 3.6 .

UPD
LLVM nativeMode := ┬лrelease┬╗ ┬лimmix gc┬╗, :

  • тАФ 2.3
  • тАФ 63

Rust:

тАФ , , , , , . , borrow-checker.

fn sort_imp(arr: &mut Vec<f64>) {
  fn swap(arr: &mut Vec<f64>, i: usize, j: usize) {
    let t = arr[i];
    arr[i] = arr[j];
    arr[j] = t;
  };

  fn sort1(arr: &mut Vec<f64>, l: usize, r: usize) {
    let pivot = arr[(l + r) / 2];
    let mut i = l;
    let mut j = r;
    while i <= j {
      while arr[i] < pivot { i += 1; }
      while arr[j] > pivot { j -= 1; }
      if i <= j {
        swap(arr, i, j);
        i += 1;
        j -= 1;
      }
    }
    if l < j { sort1(arr, l, j); }
    if i < r { sort1(arr, i, r); }
  };

  if arr.len() > 1 {
    sort1(arr, 0, arr.len() - 1);
  }
}

тАФ , , Rust , .

iter() filter() , x &&f64, **. . append() , , .

fn sort_fun(arr: Vec<f64>) -> Vec<f64> {
  if arr.len() <= 1 {
    arr
  } else {
    let pivot = arr[arr.len() / 2];
    let mut a = Vec::<f64>::with_capacity(arr.len());
    a.append(&mut sort_fun(arr.iter().filter(|x| pivot > **x).cloned().collect()));
    a.append(&mut arr.iter().filter(|x| pivot == **x).cloned().collect());
    a.append(&mut sort_fun(arr.iter().filter(|x| pivot < **x).cloned().collect()));
    a
  }
}

UPD
:

fn sort_fun(arr: Vec<f64>) -> Vec<f64> {
    if arr.len() <= 1 {
        arr
    } else {
        let pivot = arr[arr.len() / 2];
        [
            sort_fun(arr.iter().filter(|&&x| pivot > x).cloned().collect()),
            arr.iter().filter(|&&x| pivot == x).cloned().collect(),
            sort_fun(arr.iter().filter(|&&x| pivot < x).cloned().collect()),
        ]
        .concat()
    }
}

, тАФ iter().filter(...).chain(...). zero-cost, , , тАФ . , .

тАФ , тАФ , ( ).

($ cargo build --release):

  • тАФ 2
  • тАФ 9

тАФ 650 .

:

, тАФ , . , тАФ , Rust -, , Rust , (, null ).

-, zero-cost тАФ . Rust тАФ - . , 2019 Scala Rust .

Scala.
Rust.

.

Source: https://habr.com/ru/post/hi482318/


All Articles