use rand::{thread_rng, Rng}; use std::num::ParseIntError; use std::convert::TryInto; #[derive(Debug, Clone, Copy)] struct intsort { integer: i32, sorted: i32, } //impl Copy for intsort { //} //impl Clone for intsort { // fn clone(&self) -> Self {*self} //} fn sorted(arr: &[intsort]) -> bool { for i in arr { if i.sorted != 1 { return false; } } true } fn sort2slice(arr: &mut &mut [intsort] ) { // let mut arr = &arr1; let arrsize = arr.len(); // let randomelements = arr[thread_rng().gen_range(0, arrsize-1 )]; match arrsize { 1 => { arr[0].sorted=1} , 2=> { println!("arr[o] {:?}, arr[1] {:?}", arr[0], arr[1]); if arr[0].integer< arr[1].integer { arr[0].sorted=1; arr[1].sorted=1; } else {arr.swap(0,1); arr[0].sorted=1; arr[1].sorted=1; } } _ => {println!("{:?}", "size above2"); let randomelements = arr[thread_rng().gen_range(0, arrsize-1)].clone() ; println!("randomelements: {:?}", randomelements.integer); // let mut i:usize=0; let mut j:usize =arrsize.clone(); let mut leftpartcount =0; println!("arrsize {:?}", j); j=j-1; // let mut arr2 = Vec::with_capacity(j); 'outer: for i in 0..arrsize-1 { println!("I: {:?}", i+1); if i ==j {println!("i==j {:?} j: {:?}", i, j ); leftpartcount=leftpartcount+1; ;break; } if arr[i].integer <= randomelements.integer { println!("element smaller then random. doing nothing {:?}< {:?}", arr[i].integer,randomelements.integer); leftpartcount= leftpartcount + 1; println!("leftpart:{:?}", leftpartcount); continue; } else { println!("try to swap elements : I:{:?} arr[i]: {:?}", i, arr[i].integer ); while arr[j].integer>= randomelements.integer { //j=j-1; println!("arr[j]:{:?} j: {:?} arr[i]: {:?} i: {:?}", arr[j].integer, j , arr[i].integer, i); if j<=i {println!("break"); j=arrsize-1; break 'outer ;} j=j-1; println!("arr[j]= {:?}", arr[j].integer); } println!("trying to swap elements arr[i]: {:?} arr[j]: {:?}", arr[i], arr[j]); arr.swap(i,j); println!("swapping result {:?} {:?} i; {:?}", arr[i].integer, arr[j].integer, i); arr[i].sorted=0; arr[j].sorted=0; j=arrsize-1; // leftpartcount= leftpartcount + 1; } } println!("final J: {:?} arrsize : {:?} leftpartcount {:?}", j, arrsize, leftpartcount ); // if j==arrsize-1 {arr[0].sorted= (arrsize-1).try_into().unwrap();} else { if (arrsize-leftpartcount>1) { println!("set rightpart"); arr[leftpartcount].sorted=(arrsize-leftpartcount).try_into().unwrap(); arr[0].sorted=(leftpartcount).try_into().unwrap(); if leftpartcount ==0 {arr[0].sorted=arrsize.try_into().unwrap();} } else { arr[0].sorted=(leftpartcount+1).try_into().unwrap(); }; //} println!("=========================="); for k in 0..arrsize { println!("K : {:?} value : {:?}" , k , arr[k]); } } }} fn main() { println!("Hello, world!"); let mut myarray = Vec::new(); myarray.extend( [ 5, 7, 8, 9, 23, 1, 134, 245, 11, 356, 521, 12, 2, 4, 6, 87, 45, 25, 34, 999, ] .iter() .cloned(), ); let mut arr2: Vec = Vec::new(); arr2.extend([5, 7, 8, 9, 12, 3432, 32, 4].iter().cloned()); //println!("{:?}", quicksort(myarray).unwrap()); let mut arrint: Vec = Vec::new(); arrint.push(intsort { integer: 10, sorted: 0, }); arrint.push(intsort { integer: 5, sorted: 0, }); arrint.push(intsort { integer: 7, sorted: 0, }); arrint.push(intsort { integer: 1, sorted: 0, // }); arrint.push(intsort { integer:150, sorted: 0, }); arrint.push(intsort { integer:11, sorted: 0, }); arrint.push(intsort { integer:22, sorted: 0, }); arrint.push(intsort { integer:143, sorted: 0, }); println!("{:?}", sorted(&arrint)); sort2slice(&mut arrint.get_mut(..).unwrap()); let arrsize = arrint.len(); while !sorted(&arrint) { for i in 0..arrint.len()-1 { if arrint[i].sorted==0 {continue} if arrint[i].sorted!=1 { let slicesize = arrint[i].sorted.clone(); println!("slicesize: {:?}", slicesize); sort2slice(&mut arrint.get_mut(i..(i+slicesize as usize)).unwrap()); } } for j in &arrint {println!("integer : {:?} sorted: {:?}", j.integer, j.sorted)}; println!("++++++++++++++++++++++++++++++++++++"); } // sort2slice(&mut arrint); for i in arrint { println!("int:{:?} sorted: {:?}", i.integer, i.sorted); } }