BubbleSort Implementation - java
I tried to make an implementation of bubble sort, but I am not sure whether it is correct or not. If you can give it a look and if it is a bubble sort and can be done in better way please don't be shy. Here is the code:
package Exercises;
import java.util.*;
public class BubbleSort_6_18
{
public static void main(String[] args)
{
Random generator = new Random();
int[] list = new int[11];
for(int i=0; i<list.length; i++)
{
list[i] = generator.nextInt(10);
}
System.out.println("Original Random array: ");
printArray(list);
bubbleSort(list);
System.out.println("\nAfter bubble sort: ");
printArray(list);
}
public static void bubbleSort(int[] list)
{
for(int i=0; i<list.length; i++)
{
for(int j=i + 1; j<list.length; j++)
{
if(list[i] > list[j])
{
int temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
}
}
public static void printArray(int[] list)
{
for(int i=0; i<list.length; i++)
{
System.out.print(list[i] + ", ");
}
}
}
private static int [] bublesort (int[] list , int length) {
boolean swap = true;
int temp;
while(swap){
swap = false;
for(int i = 0;i < list.length-1; i++){
if(list[i] > list[i+1]){
temp = list[i];
list[i] = list[i+1];
list[i+1] = temp;
swap = true;
}
}
}
return list;
}
Mohammod Hossain implementation is quite good but he does alot of unecessary iterations, sadly he didnt accept my edit and i can't comment due to reputations points so here is how it should look like:
public void sort(int[] array) {
int temp = 0;
boolean swap = true;
int range = array.length - 1;
while (swap) {
swap = false;
for (int i = 0; i < range; i++) {
if (array[i] > array[i + 1]) {
temp = array[i];
array[i] = array[i + 1];
array[i + 1] = temp;
swap = true;
}
}
range--;
}
}
This is the calssical implementation for bubble sort and it seems to be OK. There are several optimizations that can be done, but the overall idea is the same. Here are some ideas:
If there is an iteration of the outer cycle when no swap is performed in the inner cycle, then break, no use to continue
On each iteration of the outer cycle swap the direction of the inner one - do it once left to right and then do it once right to left(this helps avoid elements moving slowly towards the right end).
{
System.out.println("The Elments Before Sorting:");
for(i=0;i<a.length;i++)
{
System.out.print(a[i]+"\t");
}
for(i=1;i<=a.length-1;i++)
{
for(j=0;j<=a.length-i-1;j++)
{
if((a[j])>(a[j+1]))
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
System.out.println("The Elements After Sorting:");
for(i=0;i<a.length;i++)
{
System.out.println(a[i]+"\t");
}
}
}
Short Answer: This is definitely NOT Bubble sort. It is a variant of Selection sort (a less efficient variant than the commonly known one).
It might be helpful to see a visualization of how they work on VisuAlgo
Why this is not bubble sort?
Because you loop over the array and compare each element to each other element on its right. if the right element is smaller you swap. Thus, at the end of the first outer loop iteration you will have the smallest element on the left most position and you have done N swaps in the worst case (think of a reverse-ordered array).
If you think about it, you did not really need to do all these swaps, you could have searched for the minimum value on the right then after you find it you swap. This is simply the idea of Selection sort, you select the min of remaining unsorted elements and put it in its correct position.
How does bubble sort look like then?
In bubble sort you always compare two adjacent elements and bubble the larger one to the right. At the end of the first iteration of the outer loop, you would have the largest element on the right-most position. The swap flag stops the outer loop when the array is already sorted.
void bubbleSort(int[] arr) {
boolean swap = true;
for(int i = arr.length - 1; i > 0 && swap; i--) {
swap = false;
// for the unsorted part of the array, bubble the largest element to the right.
for (int j = 0; j < i; j++) {
if (arr[j] > arr[j+1]) {
// swap
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
swap = true;
}
}
}
}
Yes it seems to be Bubble sort swapping the elements
Bubble sort
void bubbleSort(int arr[])
{
int n = arr.length;
for (int i = 0; i < n-1; i++)
for (int j = 0; j < n-i-1; j++)
if (arr[j] > arr[j+1])
{
// swap temp and arr[i]
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
It will give in worst case O(n^2) and even if array is sorted.
I think you got the idea of bubble sort by looking at your code:
Bubble sort usually works like the following:
Assume aNumber is some random number:
for (int i = 0; i < aNumber; i++)
{
for(int j = 0; j < aNumber; j++)
//Doing something with i and j, usually running it as a loop for 2D array
//array[i][j] will give you a complete sort.
}
How bubble sort works is it iterates through every single possible spot of the array. i x j times
The down side to this is, it will take square the number of times to sort something. Not very efficient, but it does get the work done in the easiest way.
You can loop over the array until no more elements are swapped
When you put the element at the last position you know it's the largest, so you can recuce the inner loop by 1
A bubblesort version with while loops from my first undergraduate year ("the BlueJ era").
public static void bubbleSort()
{
int[] r = randomArrayDisplayer();
int i = r.length;
while(i!=0){
int j = 0;
while(j!=i-1){
if(r[j+1]<r[j]){
swap(r,j,j+1);
}
j++;
}
i--;
}
}
private static void swap(int[] r, int u, int v)
{
int value = r[u];
r[u] = r[v];
r[v] = value;
arrayDisplayer(r);
}
My advice is to display every step in order to be sure of the correct behaviour.
public class BubbleSort {
public static void main(String[] args) {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
BubbleSort client=new BubbleSort();
int[] result=client.bubbleSort(arr);
for(int i:result)
{
System.out.println(i);
}
}
public int[] bubbleSort(int[] arr)
{
int n=arr.length;
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i-1;j++)
if(arr[j]>arr[j+1])
swap(arr,j,j+1);
}
return arr;
}
private int[] swap(int[] arr, int i, int j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
return arr;
}
}
Above code is looks like implementation Selection sort , it's not a bubble sort.
Please find below code for bubble sort.
Class BubbleSort {
public static void main(String []args) {
int n, c, d, swap;
Scanner in = new Scanner(System.in);
System.out.println("Input number of integers to sort");
n = in.nextInt();
int array[] = new int[n];
System.out.println("Enter " + n + " integers");
for (c = 0; c < n; c++)
array[c] = in.nextInt();
for (c = 0; c < ( n - 1 ); c++) {
for (d = 0; d < n - c - 1; d++) {
if (array[d] > array[d+1]) /* For descending order use < */
{
swap = array[d];
array[d] = array[d+1];
array[d+1] = swap;
}
}
}
System.out.println("Sorted list of numbers");
for (c = 0; c < n; c++)
System.out.println(array[c]);
}
}
/*
Implementation of Bubble sort using Java
*/
import java.util.Arrays;
import java.util.Scanner;
public class BubbleSort {
/**
* #param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.println("Enter the number of elements of array");
int n = in.nextInt();
int []a = new int[n];
System.out.println("Enter the integer array");
for(int i=0; i<a.length; i++)
{
a[i]=in.nextInt();
}
System.out.println("UnSorted array: "+ Arrays.toString(a));
for(int i=0; i<n; i++)
{
for(int j=1; j<n; j++)
{
if(a[j-1]>a[j])
{
int temp = a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
System.out.println("Sorted array: "+ Arrays.toString(a));
}
}
/*
****************************************
Time Complexity: O(n*n)
Space Complexity: O(1)
****************************************
*/
class BubbleSort {
public static void main(String[] args) {
int a[] = {5,4,3,2,1};
int length = a.length - 1;
for (int i = 0 ; i < length ; i++) {
for (int j = 0 ; j < length-i ; j++) {
if (a[j] > a[j+1]) {
int swap = a[j];
a[j] = a[j+1];
a[j+1] = swap;
}
}
}
for (int x : a) {
System.out.println(x);
}
}
}
int[] nums = new int[] { 6, 3, 2, 1, 7, 10, 9 };
for(int i = nums.Length-1; i>=0; i--)
for(int j = 0; j<i; j++)
{
int temp = 0;
if( nums[j] < nums[j + 1])
{
temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
package com.examplehub.sorts;
public class BubbleSort implements Sort {
/**
* BubbleSort algorithm implements.
*
* #param numbers the numbers to be sorted.
*/
public void sort(int[] numbers) {
for (int i = 0; i < numbers.length - 1; ++i) {
boolean swapped = false;
for (int j = 0; j < numbers.length - 1 - i; ++j) {
if (numbers[j] > numbers[j + 1]) {
int temp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = temp;
swapped = true;
}
}
if (!swapped) {
break;
}
}
}
/**
* Generic BubbleSort algorithm implements.
*
* #param array the array to be sorted.
* #param <T> the class of the objects in the array.
*/
public <T extends Comparable<T>> void sort(T[] array) {
for (int i = 0; i < array.length - 1; ++i) {
boolean swapped = false;
for (int j = 0; j < array.length - 1 - i; ++j) {
if (array[j].compareTo(array[j + 1]) > 0) {
T temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
swapped = true;
}
}
if (!swapped) {
break;
}
}
}
}
source from
function bubbleSort(arr,n) {
if (n == 1) // Base case
return;
// One pass of bubble sort. After
// this pass, the largest element
// is moved (or bubbled) to end. and count++
for (let i = 0; i <n-1; i++){
if (arr[i] > arr[i + 1])
{
let temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
// Largest element is fixed,
// recur for remaining array
console.log("Bubble sort Steps ", arr, " Bubble sort array length reduce every recusrion ", n);
bubbleSort(arr, n - 1);
}
let arr1 = [64, 3400, 251, 12, 220, 11, 125]
bubbleSort(arr1, arr1.length);
console.log("Sorted array : ", arr1);
Here's an implementation for the bubble sort algorithm using Stack:
static void bubbleSort(int[] elements) {
Stack<Integer> primaryStack = new Stack<>();
Stack<Integer> secondaryStack = new Stack<>();
int lastIndex = elements.length - 1;
for (int element : elements) {
primaryStack.push(element);
} // Now all the input elements are in primaryStack
// Do the bubble sorting
for (int i = 0; i < elements.length; i++) {
if (i % 2 == 0) sort(elements, i, primaryStack, secondaryStack, lastIndex);
else sort(elements, i, secondaryStack, primaryStack, lastIndex);
}
}
private static void sort(int[] elements, int i, Stack<Integer> stackA, Stack<Integer> stackB, int lastIndex) {
while (!stackA.isEmpty()) { // Move an element from stack A to stack B
int element = stackA.pop();
if (stackB.isEmpty() || element >= stackB.peek()) { // Don't swap, just push
stackB.push(element);
} else { // Swap, then push
int temp = stackB.pop();
stackB.push(element);
stackB.push(temp);
}
}
elements[lastIndex - i] = stackB.pop();
}
Related
Why is my selection sort algorithm not working?
I'm trying to make a selection sort algorithm in java that finds the smallest element of an unsorted array and puts it on the end of a new array. But my program only copies the first element twice, gets the next one, and then the rest is all zeroes: public static int find_min(int[] a){ int m = a[0]; for (int i = 0; i < a.length; i++){ if (m > a[i]) m = a[i]; } return m; } public static int[] selectionSort(int[] unsorted){ int[] c = new int[unsorted.length]; for(int i = 0; i < unsorted.length; i++){ int smallest = find_min(unsorted); c[i] = smallest; unsorted = Arrays.copyOfRange(unsorted, i+1, unsorted.length ); } return c; } When I put in something like: public static void main(String[] args){ int a[] = {1,-24,4,-4,6,3}; System.out.println(Arrays.toString(selectionSort(a))); } I get: [-24, -24, -4, 0, 0, 0] where is this going wrong? Is this a bad algorithm?
Ok, let's revisit the selection sort algorithm. public static void selectionSort(int[] a) { final int n = a.length; // to save some typing. for (int i = 0; i < n - 1; i++) { // i is the position where the next smallest element should go. // Everything before i is sorted, and smaller than any element in a[i:n). // Now you find the smallest element in subarray a[i:n). // Actually, you need the index // of that element, because you will swap it with a[i] later. // Otherwise we lose a[i], which is bad. int m = i; for (int j = m + 1; j < n; j++) { if (a[j] < a[m]) m = j; } if (m != i) { // Only swap if a[i] is not already the smallest. int t = a[i]; a[i] = a[m]; a[m] = t; } } } In conclusion You don't need extra space to do selection sort Swap elements, otherwise you lose them Remembering the loop invariant is helpful
Java bubble sort
i'm trying to create a bubble sort but I there is something wrong with my code. The output is : 82345679. I would like it to be : 23456789. package com.company; public class Main { public static void main(String[] args) { // write your code here int[] tab = {9,8,7,6,5,4,3,2}; int[] result = {9,8,7,6,5,4,3,2}; for (int i = 0; i < result.length; i++ ) { if (i < result.length - 1 ) { if (result[i] > result[i+1]) { result = permute(result, i); i = 0; } } } for (int i: result) { System.out.print(i); } } public static int[] permute (int[] tableau, int index) { int temp; temp = tableau[index]; tableau[index] = tableau[index+1]; tableau[index+1] = temp; return tableau; } }
The issue is with the combination of i = 0 and i++ in the for loop. Whenever you go in the i = 0 branch, you end up restarting at 1 because of the i++. Resulting in always skipping the 8 after the first iteration where the 9 is moved to the end. So, either restart at -1, or use a while loop and only increment in an else block. For example: int i = 0; while (i < result.length - 1) { if (result[i] > result[i+1]) { permute(result, i) i = 0; } else { i++; } } However, I would advise against the one-loop bubble sort, because the algorithm complexity is harder to see (it is still O(n^2), but with only one loop it can give the impression that it is O(n)).
You need two loops. int swap; for (int i = 0; i < ( result.length - 1 ); i++) { for (int j = 0; j < result.length - 1; j++) { if (result[j] > result[j+1]) { swap = result[j]; result[j] = result[j+1]; result[j+1] = swap; } } }
You need to have 2 loops in order to compare each number to the whole array.. example of bubble sorting public static void bubbleSort(int[] numArray) { int n = numArray.length; int temp = 0; for (int i = 0; i < n; i++) { for (int j = 1; j < (n - i); j++) { if (numArray[j - 1] > numArray[j]) { temp = numArray[j - 1]; numArray[j - 1] = numArray[j]; numArray[j] = temp; } } } } Refer to this question Sorting an Array of int using BubbleSort
Can be done with ONE loop (although it is not the usual way to present the bubble sort): public static void main (String args[]) { int[] tab = {9,8,7,6,5,4,3,2}; int i=1; // let's do the bubble sort again while (i < tab.length) { // loop invariant : t[0] <= t[1] .... <= t[i-1] if (tab[i-1] < tab[i]) { // bubble here swap(tab, i-1, i); if (i>1) { i = i-1; // one step to the left.... } } else { i = i +1; // one step to the right } } for (int x: tab) { System.out.print(x); } } static void swap(int[] t, int i, int j) { int x = t[i]; t[i] = t[j]; t[j] = x; }
How do you Bubble Sort Largest to Smallest
Sorry am kind of lame at this. I've looked on here for a way to Bubble sort so that I can get an array to go from largest number to smallest. I've found some error in my current iteration of the sort, I can't seem to get the array to sort once it compares a smaller number to a bigger number. Here what I am using thus far. //bubble sort for(int i=0;i<size;i++) { for(int v=1;i<(size-i);i++) { if(arrInt[v-1]<arrInt[v]) { temp = arrInt[v-1]; arrInt[v-1]=arrInt[v]; arrInt[v]=temp; } } }
int n = arrInt.length; int temp = 0; for (int i = 0; i < n; i++) { for (int v = 1; v < (n - i); v++) { if (arrInt[v - 1] < arrInt[v]) { temp = arrInt[v - 1]; arrInt[v - 1] = arrInt[v]; arrInt[v] = temp; } } } Try this. Update - Replaced j with v
The problem is the inner loop should be from 1 to n. Instead your inner loop stops early. Also you are testing i in the inner loop condition, but you should be testing v. Try this: //bubble sort for(int i=0;i<size;i++) { for(int v=1;v<size;v++) { if(arrInt[v-1]<arrInt[v]) { temp = arrInt[v-1]; arrInt[v-1]=arrInt[v]; arrInt[v]=temp; } } }
Bubble Sort Method for Descending Order public static void BubbleSort( int[ ] arr){ int records=arr.length-1; boolean notSorted= true; // first pass while (notSorted) { notSorted= false; //set flag to false awaiting a possible swap for( int count=0; count < records; count++ ) { if ( arr[count] < arr[count+1] ) { // change to > for ascending sort arr[count]=arr[count]+arr[count+1]; arr[count+1]=arr[count]-arr[count+1]; arr[count]=arr[count]-arr[count+1]; notSorted= true; //Need to further check } } } } In this method when array is sorted then it does not check further.
Usually I implement Bubble sort like this, for(int i=0;i<size-1;i++) { for(int v=0;v<(size-1-i);v++){ if(arrInt[v]<arrInt[v+1]) { temp = arrInt[v]; arrInt[v]=arrInt[v+1]; arrInt[v+1]=temp; } } } You know what is the problem is, in your code??? Look at the inner loop, you are initializing v but checking and changing i. Must be a copy paste error.. :P Hope it helped...
Here you go: int x = 0; for(int i = 0; i < array.length; i++) for(int j = 0; j < array.length; j++) if(array[i] > array[j + 1]) x = array[j + 1]; array[j + 1]= array[i]; array[i] = x; x here is a temporary variable you only need for this operation.
here's a complete running program for you. Hope that keeps you motivated package test; public class BubbleSort { private static int[] arr = new int[] { 1, 45, 65, 89, -98, 2, 75 }; public static void sortBubbleWay() { int size = arr.length-1; int temp = 0; // helps while swapping for (int i = 0; i < size - 1; i++) { for (int j = 0; j < size - i; j++) { if (arr[j] < arr[j+1]) { /* For decreasing order use < */ temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } private static void showShortedArray() { for (int elt : arr) { System.out.println(elt); } } public static void main(String args[]) { sortBubbleWay(); showShortedArray(); } }//end of class
Selection Sort in Java, ways I can improve the code?
This is the code I have for my selection sort program, I want to know if there's any way of improving the code without using additional methods or classes. public class Selection_Sort { public static void main(String[] args) { int arr[]={234,151,123,4,5342,76,48}; int min=0; int temp; for(int i=0;i<=arr.length-1;i++){ min=i; for (int k=i+1;k<arr.length;k++){ if(arr[k]<arr[i]){ temp=arr[i]; arr[i]=arr[k]; arr[k]=temp; } } } for (int j=0;j<=arr.length-1;j++) System.out.println(arr[j]+" "); } }
public static void main(String[] args) { int arr[]={234,151,123,4,5342,76,48}; int arrLength = arr.length; for(int i=0;i<arrLength-1;i++){ int min=i; for (int k=i+1;k<arrLength;k++){ if(arr[k]<arr[min]){ min = k; } } if (i != min) { int temp=arr[i]; arr[i]=arr[min]; arr[min]=temp; } } for (int j=0;j<arrLength;j++) { System.out.println(arr[j]+" "); } }
Looks like you are using the bubblesort algorithm which is very slow. If you want to improve your code, i would recommend to use an algorithm like ripplesort or quicksort.
Slight improvement should be like this : int arrayLength = arr.length; // Then use it in conditional statement of for loop. So that it won't invoke length property of Array every time in loop. For small number of loops it doesn't impact much but it will help to reduce the time when loops are more or number of iteration of loop are more.
The value of the local variable min is not used k <= arr.length-1 --> k < arr.length
Use this class Selection { public static void main(String[] args) { int arr[]={234,151,123,4,5342,76,48}; /* arr[0] to arr[n-1] is the array to sort */ int lowest, i, j; for(i = 0 ; i < arr.length-1; i++) { /* advance the position through the entire array */ lowest = i; /* assume the min is the first element */ for(j = i+1 ; j < arr.length; j++) { /* if this element is less, then it is the new minimum */ if(arr[j] < arr[lowest]) { lowest = j; /* found new minimum; remember its index */ } } if(lowest != i) { /* lowest is the index of the minimum element. Swap it with the current position */ int temp = arr[i]; arr[i] = arr[lowest]; arr[lowest] = temp; } } for (int k = 0; k <= arr.length-1 ; k++) { System.out.println(arr[k] + " "); } } } This is the selection sort algorithm you asked.
Here is original Selection sort implementation. The implementation in question in not using min to perform the swap operation. public static void sort(int[] arr) { int min=-1; for (int i = 0; i < arr.length; i++) { min = i; for (int j = i + 1; j < arr.length; j++) { if (arr[min] > arr[j]) { min = j; } } if (min != i) { int temp = arr[min]; arr[min] = arr[i]; arr[i] = temp; } } }
public class JavaApplication55 { public static void main(String[] args) { int[] array ={234,435,567,768,123,456,789,789,5670,6789}; for(int j =0;j< array.length;j++){ for(int i =j+1;i < array.length;i++ ){ int temp; if(array[j]>array[i]){ temp =array[j]; array[j] =array[i]; array[i] =temp; } else{} }} for(int k =0;k< array.length;k++){ System.out.println(array[k]); } } enter code here }
Sorting in java for array only containing 0 and 1
How to sort array int[] A = {0,1,1,0,1,0,1,1,0}
You can actually sort this array by traversing the array only once. Here is the snippet of my code: int arr[] = {1,1,1,1,0, 0,1,0,1,1,1}; int arrb[] = new int[arr.length]; int zeroInsertIndex = 0; int oneInsertIndex =arrb.length-1; for(int i=0; i<arr.length; i++){ if(arr[i] == 1) arrb[oneInsertIndex--] = 1; else if (arr[i] == 0) arrb[zeroInsertIndex++] = 0; } for(int i=0;i<arrb.length;i++) System.out.print(arrb[i] + " ");
Although Arrays.sort is an obvious, simple, O(n log n) solution, there is an O(n) solution for this special case: Count the number of zeros, zeroCount. Fill the first zeroCount elements with 0, the remaining elements with 1. This takes just two passes over the array. More generally, any array with only a small number of distinct values can be sorted by counting how many times each value appears, then filling in the array accordingly.
use any sorting algorithm to do it. For beginner use bubble sort (easy to understand) Refer Wiki public static void bubble_srt( int a[], int n ){ int i, j,t=0; for(i = 0; i < n; i++){ for(j = 1; j < (n-i); j++){ if(a[j-1] > a[j]){ t = a[j-1]; a[j-1]=a[j]; a[j]=t; } } } } EDITED As #Pradeep Said: You may definitely use Array.sort()
Your array contains only zeros and one so sum all the elements in the array and then reset the array with those many '1's in the end and rest '0's in the beginning. Time complexity is also O(n) with constant space. So it seems the best and easy one. public static void main(String[] args) { int[] A = { 0, 1, 1, 0, 1, 0, 1, 1, 0 }; int sum = 0; for (int i = 0; i < A.length; i++) sum = sum + A[i]; Arrays.fill(A, A.length - sum, A.length, 1); Arrays.fill(A, 0, A.length - sum, 0); System.out.println(Arrays.toString(A)); } Try this I implemented the above algorithm. Output: [0, 0, 0, 0, 1, 1, 1, 1, 1]
You can use Arrays.sort method from Arrays class: int[] A = {0,1,1,0,1,0,1,1,0}; Arrays.sort(A); System.out.println(A);
Actually standard off-the-shelf sorting algorithms will typically work on O(n*log(n)). You could just run through the array once adding all the values (i.e. the number of 1). Let's say you put this in count1. Then go once more over the array setting the first count1 positions to 1, and the rest to 0. It takes 2n steps. Of course, as other posters said: this kind of optimizations is what you do once you've detected a bottleneck, not right off the bat when you start.
Arrays.sort(A,Collections.reverseOrder());
USE Arrays.sort(A); method to sort your array.
You can try like this also public static void main(String[] args) { int inputArray[] = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0 }; formatInputArray(inputArray); } private static void formatInputArray(int[] inputArray) { int count = 0; for (int i = 0; i < inputArray.length; i++) { if (inputArray[i] == 0) { count++; } } // System.out.println(count); for (int i = 0; i < inputArray.length; i++) { if (i < count) { inputArray[i] = 0; } else { inputArray[i] = 1; } } for (int i = 0; i < inputArray.length; i++) { System.out.print(inputArray[i] + " , "); } }
Sort Array which contains only 0,1 and 2 import java.util.*; public class HelloWorld { static void sort012(int []a, int length) { int start = 0; int mid = 0; int end = length - 1; int temp; while(mid<=end) { switch(a[mid]) { case 0: temp = a[start]; a[start] = a[mid]; a[mid] = temp; start++; mid++; break; case 1: mid++; break; case 2: temp = a[end]; a[end] = a[mid]; a[mid] = temp; end--; break; } } } public static void main(String []args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int a[] = new int[n]; for (int i =0;i<n; i++) a[i] = sc.nextInt(); HelloWorld.sort012(a, n); // Print the sorted Array for (int i =0;i<n; i++) System.out.println(a[i]); } }
var binaryArr = [1,1,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,0,1,0,1,0,0,0,0]; //i - starting index //j - ending index function binarySort(arr){ var i=0,j=arr.length-1; for(;i!=j;){ if(arr[i] == 1){ if(arr[j] == 0){ arr[i] = 0; arr[j] = 1; j--; i++; } else { j--; } }else{ i++; } } } binarySort(binaryArr);
Team Please consider the below program in Swift in o(n) time complexity and constant extra space. import UIKit var inputArray = [1,0,1,0,0,0,0,1,1,1,1,1,1] var leftIndex: Int = 0 var rightIndex: Int = inputArray.count-1 while leftIndex < rightIndex{ while inputArray[leftIndex] == 0 && leftIndex < rightIndex{ leftIndex = leftIndex+1 } while inputArray[rightIndex] == 1 && rightIndex > leftIndex { rightIndex = rightIndex-1 } if leftIndex < rightIndex{ inputArray[leftIndex] = 0 inputArray[rightIndex] = 1 leftIndex = leftIndex+1 rightIndex = rightIndex-1 } } print(inputArray)
Sort 0 and 1 array using below code: public static int[] sortArray(int[] array){ int first = 0; int last = array.length-1; while(first<last){ if(array[first]==0){ first++; }else if(array[last] == 0){ int temp = array[last]; array[last] = array[first]; array[first] = temp; first++; }else{ last--; } } return array; }
public static void sort(int a[]) { int sum=0; int b[]= new int [a.length]; for(int i=0;i<a.length;i++) { sum=sum+a[i]; } System.out.println(sum); int j=b.length-1; while(sum>0) { b[j]=1; sum--; j--; } System.out.println(Arrays.toString(b)); }
public class Test { public static void main(String[] args) { int[] arr = {0, 1, 0, 1, 0, 0, 1, 1, 1, 0}; int start = 0; for (int i = 0; i < arr.length; i++) { if (arr[i] == 0) { arr[start] = 0; if (i != start) { // should not override same value with 1 arr[i] = 1; } start++; } } for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } } //complexity is O(n)
If its just 0's and 1's, it can be done using two pointers. c# code snippet : int i = 0; int j = input.Length - 1; while (i < j) { if (input[i] == 0 && input[j] == 0) i++; else if(input[i] == 1 && input[j] == 1) j--; else if (input[i] > input[j]) { input[i++] = 0; input[j--] = 1; } else { i++; j--; } }
int[] a = {0,1,1,0,1,0,1,1,0} Here, we are iterating with i where i starts from 1. so we can compare previous index value with the current value of i. Used swapping technique to sort the array. Note: Sort/2 pointer technique we can also use. public int[] sort(int[] a){ int temp=0; for(int i=1;i<a.length;i++){ if( a[i-1] > a[i]){ temp = a[i-1]; a[i-1] = a[i]; a[i] = temp; } } return a[i]; } Time complexity : O(n)
The following code will sort your array. Please notice that it does so in place - so it modifies the object in memory instead of returning a new one. In Python arr=[0,1,0,0,1,1,1,0,1,1,0] arr.sort() print(arr) In Java public class test{ public static void main(String[] args){ int[] arr= {0,1,0,0,1,1,1,0,1,1,0}; Arrays.sort(arr); System.out.println(Arrays.toString(arr)); }}