Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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<i32> = Vec::new();
- arr2.extend([5, 7, 8, 9, 12, 3432, 32, 4].iter().cloned());
- //println!("{:?}", quicksort(myarray).unwrap());
- let mut arrint: Vec<intsort> = 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);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement