Add example for bucket sort
This commit is contained in:
parent
a7d11c559e
commit
de0d706f98
|
@ -22,3 +22,4 @@ add_subdirectory(bubble)
|
||||||
add_subdirectory(heap)
|
add_subdirectory(heap)
|
||||||
add_subdirectory(quick)
|
add_subdirectory(quick)
|
||||||
add_subdirectory(count)
|
add_subdirectory(count)
|
||||||
|
add_subdirectory(bucket)
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
###############################################################################
|
||||||
|
## Author: Shaun Reed ##
|
||||||
|
## Legal: All Content (c) 2021 Shaun Reed, all rights reserved ##
|
||||||
|
## About: A basic CMakeLists configuration to practice bucket sort ##
|
||||||
|
## ##
|
||||||
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
project(BucketSort LANGUAGES CXX)
|
||||||
|
|
||||||
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||||
|
|
||||||
|
add_executable(bucket-sort "bucket-sort.cpp")
|
||||||
|
|
||||||
|
add_library(lib-bucket "lib-bucket.cpp")
|
||||||
|
target_link_libraries(bucket-sort lib-bucket)
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*#############################################################################
|
||||||
|
## Author: Shaun Reed ##
|
||||||
|
## Legal: All Content (c) 2021 Shaun Reed, all rights reserved ##
|
||||||
|
## About: An example implementation of bucket sort using a custom library ##
|
||||||
|
## ##
|
||||||
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
###############################################################################
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lib-bucket.hpp"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
#include <random>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
int main(const int argc, const char * argv[])
|
||||||
|
{
|
||||||
|
srand(time(nullptr));
|
||||||
|
std::vector<float> array(ARRAY_LENGTH);
|
||||||
|
std::generate(array.begin(), array.end(),
|
||||||
|
[](){ return static_cast<float>(rand() % 1000) * 0.1f;}
|
||||||
|
);
|
||||||
|
|
||||||
|
auto print = [](std::vector<float> array) {
|
||||||
|
for (const auto &i : array) {
|
||||||
|
std::cout << i << ", ";
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::cout << "Unsorted array: \n";
|
||||||
|
print(array);
|
||||||
|
|
||||||
|
BucketSort(array);
|
||||||
|
|
||||||
|
std::cout << "Sorted array: \n";
|
||||||
|
print(array);
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*#############################################################################
|
||||||
|
## Author: Shaun Reed ##
|
||||||
|
## Legal: All Content (c) 2021 Shaun Reed, all rights reserved ##
|
||||||
|
## About: An example implementation of bucket sort using a custom library ##
|
||||||
|
## ##
|
||||||
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
###############################################################################
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lib-bucket.hpp"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <list>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
void BucketSort(std::vector<float> &array)
|
||||||
|
{
|
||||||
|
// For this example, we need an array of linked lists
|
||||||
|
// + Each value of this array will be referred to as a bucket
|
||||||
|
// + Each list stores the values that fall within the range of that bucket
|
||||||
|
std::vector<std::list<float>> bucketArray(BUCKET_ARRAY_LENGTH);
|
||||||
|
|
||||||
|
// Truncation to zero will always floor the result of division
|
||||||
|
// + If the bucket contains negative values, convert them to their absolutes
|
||||||
|
// + Run BucketSort on the abs values, then convert them back to negative
|
||||||
|
// ++ For a mixed-bag of negative and positive, track which values you absolute
|
||||||
|
// ++ Then only negate those values after BucketSort
|
||||||
|
for (const auto & value : array) {
|
||||||
|
bucketArray[value / static_cast<float>(bucketArray.size())].push_back(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Track the last used index in the final sorted array; Starting at 0
|
||||||
|
int currentIndex = 0;
|
||||||
|
// Sort each bucket in the bucketArray
|
||||||
|
for (std::list<float> &bucket : bucketArray) {
|
||||||
|
bucket.sort();
|
||||||
|
// After sorting each bucket, rewrite values in-order to final sorted array
|
||||||
|
for (const auto &value : bucket) array[currentIndex++] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*#############################################################################
|
||||||
|
## Author: Shaun Reed ##
|
||||||
|
## Legal: All Content (c) 2021 Shaun Reed, all rights reserved ##
|
||||||
|
## About: An example implementation of bucket sort using a custom library ##
|
||||||
|
## ##
|
||||||
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
||||||
|
###############################################################################
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LIB_BUCKET_HPP
|
||||||
|
#define LIB_BUCKET_HPP
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
// For this example double the size of the array to increase chance of collision
|
||||||
|
#define ARRAY_LENGTH 20
|
||||||
|
// Define how many buckets we want to use
|
||||||
|
#define BUCKET_ARRAY_LENGTH 10
|
||||||
|
|
||||||
|
void BucketSort(std::vector<float> &array);
|
||||||
|
|
||||||
|
#endif // LIB_BUCKET_HPP
|
Loading…
Reference in New Issue