ino
ino

Reputation: 1125

Merge sort code not giving desired output in rust

I was trying to do a merge sort code in rust.but its not giving the desired output.I tried to debug it for a while but sadly i couldnt find where the error is. Here is one in Rust Playground.Can you please debug it? https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=25eef03b3d421cc2ae70c3c8a1bb69cb

fn main() {
  let mut vec: Vec<u32> = vec![5,7,1,1,3,8,4,4,3,2,1,8,4,9];

  let len = vec.len();

  let left_index: usize = 0;

  let right_index: usize = len - 1;

  divide(&mut vec, left_index, right_index);

  println!("{:?}",vec);
}

fn divide(mut vec: &mut Vec<u32>, left_index: usize, right_index: usize){

  if right_index > left_index {

    let middle_index = (left_index + right_index)/2;

    divide(&mut vec, left_index, middle_index);

    divide(&mut vec, middle_index + 1, right_index); 

    sort_and_merge(&mut vec, left_index, right_index, middle_index)
  }
}  

fn sort_and_merge(vec: &mut Vec<u32>, left_index: usize, right_index: usize, middle_index: usize){

  let mut vec_left: Vec<u32> = vec![];

  let mut vec_right: Vec<u32> = vec![]; 

  for i in left_index..= middle_index{

    vec_left.push(vec[i]);

  }
  for i in (middle_index+1)..= right_index{

    vec_right.push(vec[i]);

  }
  
  let mut i = 0; // i for vec_left
  let mut j = 0; // j for vec_right
  let mut k = left_index;  

  while i < (middle_index - left_index + 1) && j < (right_index - middle_index) {

    if vec_left[i] > vec_right[j]{
      vec[k] = vec_right[j];
      j += 1;
      k += 1;
    }
    else{
      vec[k] = vec_left[i];
      i += 1;
      k += 1;
    }
  }

  while i < vec_left.len(){
    vec[k] = vec_left[i];
    i += 1;
    k += 1;
  }
 
  while j < vec_right.len(){
    vec[k] = vec_left[j];
    j += 1;
    k += 1;
  }

  
}

Upvotes: 1

Views: 53

Answers (1)

Cerberus
Cerberus

Reputation: 10247

Quoting the code in question:

  let mut j = 0; // j for vec_right
  ...
  while j < vec_right.len(){
    vec[k] = vec_left[j];
    j += 1;
    k += 1;
  }

In the last part, it seems that you'd want to use vec_right[j].

Upvotes: 2

Related Questions