From 869e82c93101ca576f1c173432f22f568daf1e7c Mon Sep 17 00:00:00 2001 From: arun Date: Sun, 1 Jul 2018 00:02:09 +1000 Subject: [PATCH] Added C implementation of QuickSort --- .gitignore | 0 BubbleSort/BubbleSort.js | 0 HeapSort/HeapSort.js | 0 MergeSort/MergeSort.js | 0 MergeSort/QueueList.js | 0 Misc/LinkedNodes.js | 0 QuickSort/QuickSort.js | 0 QuickSort/QuickSort/QuickSort | Bin 0 -> 13056 bytes QuickSort/QuickSort/Quicksort.c | 115 ++++++++++++++++++++++++++++++++ QuickSort/QuickSort/StackList | Bin 0 -> 8584 bytes QuickSort/QuickSort/StackList.c | 69 +++++++++++++++++++ QuickSort/QuickSort/StackList.h | 36 ++++++++++ QuickSort/StackList.js | 0 index.js | 6 +- 14 files changed, 223 insertions(+), 3 deletions(-) mode change 100644 => 100755 .gitignore mode change 100644 => 100755 BubbleSort/BubbleSort.js mode change 100644 => 100755 HeapSort/HeapSort.js mode change 100644 => 100755 MergeSort/MergeSort.js mode change 100644 => 100755 MergeSort/QueueList.js mode change 100644 => 100755 Misc/LinkedNodes.js mode change 100644 => 100755 QuickSort/QuickSort.js create mode 100755 QuickSort/QuickSort/QuickSort create mode 100644 QuickSort/QuickSort/Quicksort.c create mode 100755 QuickSort/QuickSort/StackList create mode 100644 QuickSort/QuickSort/StackList.c create mode 100644 QuickSort/QuickSort/StackList.h mode change 100644 => 100755 QuickSort/StackList.js mode change 100644 => 100755 index.js diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/BubbleSort/BubbleSort.js b/BubbleSort/BubbleSort.js old mode 100644 new mode 100755 diff --git a/HeapSort/HeapSort.js b/HeapSort/HeapSort.js old mode 100644 new mode 100755 diff --git a/MergeSort/MergeSort.js b/MergeSort/MergeSort.js old mode 100644 new mode 100755 diff --git a/MergeSort/QueueList.js b/MergeSort/QueueList.js old mode 100644 new mode 100755 diff --git a/Misc/LinkedNodes.js b/Misc/LinkedNodes.js old mode 100644 new mode 100755 diff --git a/QuickSort/QuickSort.js b/QuickSort/QuickSort.js old mode 100644 new mode 100755 diff --git a/QuickSort/QuickSort/QuickSort b/QuickSort/QuickSort/QuickSort new file mode 100755 index 0000000000000000000000000000000000000000..f3874cb1ca13eeef2a38eb0db805186b9b80555c GIT binary patch literal 13056 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 Wx68Wcqf*NL$tx`l+Mha$+y39MvI$rK literal 0 HcmV?d00001 diff --git a/QuickSort/QuickSort/Quicksort.c b/QuickSort/QuickSort/Quicksort.c new file mode 100644 index 0000000..c2c8830 --- /dev/null +++ b/QuickSort/QuickSort/Quicksort.c @@ -0,0 +1,115 @@ +#include +#include +#include +#include "StackList.h" +#define MAX 100 + +// swap +void swap(int a, int b, int input[]) { + if(a != b) { + int temp = input[a]; + input[a] = input[b]; + input[b] = temp; + } +} + +// comparator +int comparator(int rightValue, int pivotValue, int sortType) { + if(sortType == -1) { + return pivotValue < rightValue; + } + return rightValue < pivotValue; +} + +// partition +int partition(int right, int pivot, int arrays[], int sortType) { + int left = right; + int pivotValue = arrays[pivot]; + while(right < pivot) { + int rightValue = arrays[right]; + if(comparator(rightValue, pivotValue, sortType)) { + swap(left, right, arrays); + left++; + } + right++; + } + swap(left, pivot, arrays); + return left; + +} +// generatePosition +positionNode* generatePosition(int start, int end, int arrays[], int sortType) { + positionNode* ret = allocPosition(); + ret->start = start; + ret->end = end; + ret->partition = partition(start, end, arrays, sortType); + return ret; +} + +void QuickSort(int inputArray[], int comparator) { + // first partition + int size = MAX; + Stack* pIndice = allocStack(); + append(pIndice, generatePosition(0, size - 1, inputArray, comparator)); + + int currentPivot; + positionNode *currentPos = allocPosition(); + positionNode *firstPos = pIndice->currentNode->nodeValue; + // Copying first element + currentPos->start = firstPos->start; + currentPos->partition = firstPos->partition; + currentPos->end = firstPos->end; + firstPos = NULL; + + while((currentPos)) { + int partition = currentPos->partition; + int leftStart = currentPos->start; + int leftEnd = partition - 1; + int rightStart = partition + 1; + int rightEnd = currentPos->end; + // Left Pivot + if(leftStart < leftEnd) { + append(pIndice, generatePosition(leftStart, leftEnd, inputArray, comparator)); + } + // Right Pivot + if(rightStart < rightEnd) { + append(pIndice, generatePosition(rightStart, rightEnd, inputArray, comparator)); + } + + // This could be dangerous when memory is freed. Potential problem raising dangling pointers + // currentNode = pIndice->currentNode; + // Solution copy + + if(pIndice->currentNode) { + positionNode *lastPos = pIndice->currentNode->nodeValue; + currentPos->start = lastPos->start; + currentPos->partition = lastPos->partition; + currentPos->end = lastPos->end; + lastPos = NULL; + } + else // explicitly they are assigning NULL + currentPos = NULL; + + pop(pIndice); + + } + // Free currentPos + freePosition(currentPos); + // Free the stack + freeStack(pIndice); +} + +int main() { + // Creating a random number sequence + int random[MAX]; + + srand(time(NULL)); + for(int x = 0; x < MAX; x++) { + random[x] = rand() % 10000; + } + QuickSort(random, 1); + for(int x = 0; x < MAX; x++) { + printf("%d\n", random[x]); + } + return 0; +} \ No newline at end of file diff --git a/QuickSort/QuickSort/StackList b/QuickSort/QuickSort/StackList new file mode 100755 index 0000000000000000000000000000000000000000..406852b107557fce5d65a2008f499b83284cd4cc GIT binary patch literal 8584 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 +#include + + +void append(Stack* stackList, positionNode* appendValue) { + // Check whether stackList is empty + if(!(stackList->currentNode)) { + // Create a new node + Node *newNode = malloc(sizeof(Node)); + newNode->nextNode = NULL; + newNode->prevNode = NULL; + newNode->nodeValue = appendValue; + stackList->currentNode = newNode; + return ; + } + + Node * newNode = malloc(sizeof(Node)); + newNode->nextNode = NULL; + newNode->prevNode = stackList->currentNode; + newNode->nodeValue = appendValue; + stackList->currentNode = newNode; +} + +void pop(Stack* stackList) { + Node *currentNode = stackList->currentNode; + // If there is no element present then ignore + if(!(currentNode)) + return ; + // Get the current node value + positionNode *nodeValue = currentNode->nodeValue; + // Set the stackList currentNode to be the prev node + Node *prevNode = currentNode->prevNode; + currentNode->prevNode = NULL; + currentNode->nextNode = NULL; + // If previous node is not NULL + if(prevNode) + prevNode->nextNode = NULL; + // Free up the space used by current node + free(currentNode); + // Free up the space used by node value + freePosition(nodeValue); + stackList->currentNode = prevNode; +} + +Stack* allocStack() { + Stack *stackList = malloc(sizeof(Stack)); + return stackList; +} + +void freeStack(Stack* stackList) { + if(stackList) { + // Freeing stackList alone does not deallocates the node elements + // Hence pop all nodes + while(stackList->currentNode) + pop(stackList); + free(stackList); + } +} + +positionNode* allocPosition() { + positionNode *node = malloc(sizeof(positionNode)); + return node; +} + +void freePosition(positionNode* freeingNode) { + if(freeingNode) + free(freeingNode); +} \ No newline at end of file diff --git a/QuickSort/QuickSort/StackList.h b/QuickSort/QuickSort/StackList.h new file mode 100644 index 0000000..2c2ba21 --- /dev/null +++ b/QuickSort/QuickSort/StackList.h @@ -0,0 +1,36 @@ +#ifndef STACK_H +#define STACK_H + +/* + * @author Arun Harish Balasubramonian + * + */ +typedef struct Node Node; +typedef struct Stack Stack; +typedef struct positionNode positionNode; + +typedef struct Node{ + Node *nextNode; + Node *prevNode; + positionNode *nodeValue; +} Node; + +typedef struct Stack { + Node *currentNode; +} Stack; + +typedef struct positionNode { + int partition ; + int start ; + int end ; +} positionNode; + +void append(Stack*, positionNode*); +void pop(Stack*); +Stack* allocStack(void); +void freeStack(Stack*); + +positionNode* allocPosition(); +void freePosition(positionNode*); + +#endif \ No newline at end of file diff --git a/QuickSort/StackList.js b/QuickSort/StackList.js old mode 100644 new mode 100755 diff --git a/index.js b/index.js old mode 100644 new mode 100755 index 9dc752e..ef2471f --- a/index.js +++ b/index.js @@ -4,9 +4,9 @@ var HeapSort = require("./HeapSort/HeapSort.js"); var BubbleSort = require("./BubbleSort/BubbleSort.js"); function generateRandom() { - var random = new Array(100000); + var random = new Array(1000000); for(var x = 0; x < random.length; x++) { - random[x] = Math.floor(1 + Math.random() * 10000); + random[x] = Math.floor(1 + Math.random() * 99); } return random; } @@ -37,4 +37,4 @@ function test() { console.log(check(quickSample, 1)) } -test(); \ No newline at end of file +test();