时间:2021-05-20
SortAlgorithm.h
复制代码 代码如下:
#include <vector>
using namespace std;
class SortAlgorithm
{
public:
SortAlgorithm(int = 10);
void displayVector();
void swap(int &, int &);
void insertSort(); //O(n^2)
void selectSort(); //O(n^2)
void mergeSort(); //O(n log n)
void bubbleSort(); //O(n^2)
void quickSort( int , int ); //worst: O(n^2), best: O(n log n)
int partition( int , int );
void sortSubVector(int , int );
void merge(int , int , int , int );
private:
int size;
vector< int > source;
vector< int > temp;
};
SortAlgorithm.cpp
复制代码 代码如下:
#include <iostream>
#include <cstdlib> // prototypes for functions srand and rand
#include <ctime> // prototype for function time
#include <algorithm> // prototype for sort function
#include "SortAlgorithm.h" // class BinarySearch definition
using namespace std;
SortAlgorithm::SortAlgorithm(int vectorSize)
{
size = ( vectorSize > 0 ? vectorSize : 10 ); // validate vectorSize
srand( time( 0 ) ); // seed using current time
// fill vector with random ints in range 10-99
for ( int i = 0; i < size; i++ )
source.push_back( 10 + rand() % 90 ); // 10-99
temp = source;
}
void SortAlgorithm::insertSort()
{
int insert;
for(int next = 1; next < size; next++){
insert = temp[next];
int moveItem = next;
while((moveItem > 0) && (temp[moveItem - 1] > insert)){
temp[moveItem] = temp[moveItem - 1];
moveItem--;
}
temp[moveItem] = insert;
}
}
void SortAlgorithm::selectSort()
{
int loop = size - 1;
int smallest;
for(int i = 0; i < loop; i++){
smallest = i;
for(int j = i + 1; j < size; j++){
if(temp[j] < temp[smallest])
smallest = j;
}
swap(temp[i], temp[smallest]);
}
}
void SortAlgorithm::mergeSort()
{
sortSubVector(0, size - 1);
}
void SortAlgorithm::bubbleSort()
{
int comp; // used to control for loop and for subscripts
bool swapCheck = true; // was a swap made?
for ( int pass = 1; pass < size && swapCheck; pass++ ) {
swapCheck = false; // assume no swaps will be made
// traverse and compare unsorted part of vector
for ( comp = 0; comp < size - pass; comp++ ){
// compare adjacent vector elements
if ( temp[ comp ] > temp[ comp + 1 ] ) {
swap(temp[comp], temp[comp + 1]);
swapCheck = true;
} // end if
} // end inner for
} // end outer for
}
void SortAlgorithm::quickSort(int first, int last )
{
int currentLocation;
if ( first >= last )
return;
currentLocation = partition( first, last ); // place an element
quickSort( first, currentLocation - 1 ); // sort left side
quickSort( currentLocation + 1, last ); // sort right side
} // end function quickSortHelper
// partition the vector into multiple sections
int SortAlgorithm::partition( int left, int right )
{
int position = left;
// loop through the portion of the vector
while ( true )
{
//first: from right ro left
while ( temp[ position ] <= temp[ right ] && position != right )
--right;
if ( position == right )
return position;
if ( temp[ position ] > temp[ right ])
{
swap( temp[ position ], temp[ right ] );
position = right;
} // end if
//second: from left to right
while ( temp[ left ] <= temp[ position ] && left != position )
++left;
if ( position == left )
return position;
if ( temp[ left ] > temp[ position ] )
{
swap( temp[ position ], temp[ left ] );
position = left;
} // end if
} // end while
} // end function partition
void SortAlgorithm::sortSubVector(int low, int high)
{
if((high - low) >= 1){
int middle1 = (low + high) / 2;
int middle2 = middle1 + 1;
sortSubVector(low, middle1);
//cout << "Stop here1. low = " << low << ", middle1 = " << middle1 << endl;
sortSubVector(middle2, high);
//cout << "Stop here2. middle2 = " << middle2 << ", high = " << high << endl;
merge(low, middle1, middle2, high);
}
}
void SortAlgorithm::merge(int left, int middle1, int middle2, int right)
{
int leftIndex = left;
int rightIndex = middle2;
int combinedIndex = left;
vector<int> combined(size);
while(leftIndex <= middle1 && rightIndex <= right){
if(temp[leftIndex] <= temp[rightIndex])
combined[combinedIndex++] = temp[leftIndex++];
else
combined[combinedIndex++] = temp[rightIndex++];
}
if(leftIndex == middle2){
while(rightIndex <= right)
combined[combinedIndex++] = temp[rightIndex++];
}
else{
while(leftIndex <= middle1)
combined[combinedIndex++] = temp[leftIndex++];
}
for(int i = left; i <= right; i++)
temp[i] = combined[i];
}
void SortAlgorithm::swap(int &x, int &y)
{
int t;
t = x;
x = y;
y = t;
}
void SortAlgorithm::displayVector()
{
for(int i = 0; i < size; i++){
cout << " " << temp[i];
if((i + 1) % 10 == 0)
cout << endl;
}
cout << endl;
temp = source;
}
main.cpp
复制代码 代码如下:
#include <iostream>
#include "SortAlgorithm.h" // class BinarySearch definition
#include "BucketSort.h"
using namespace std;
int main()
{
int num;
cout << "Please input the integer number you want to sort: ";
cin >> num;
SortAlgorithm sortVector(num);
cout << "Unsort elements: \n";
sortVector.displayVector();
sortVector.insertSort();
cout << "\nInsert sorted elements: \n";
sortVector.displayVector();
sortVector.selectSort();
cout << "\nSelect sorted elements: \n";
sortVector.displayVector();
sortVector.mergeSort();
cout << "\nMerge sorted elements: \n";
sortVector.displayVector();
sortVector.bubbleSort();
cout << "\nBubble sorted elements: \n";
sortVector.displayVector();
sortVector.quickSort(0, num - 1);
cout << "\nQuick sorted elements: \n";
sortVector.displayVector();
}
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C++基数排序 大家好,今天带来的是自己实现的用C++完成基数排序.在数据结构,算法分析和程序设计的学习过程中,我们经常也无法避免的要学到排序的算法.排序算法是
C++中十种内部排序算法的比较分析#include#include#includeusingnamespacestd;#defineMAXSIZE1000//可
C++算法之希尔排序算法详解及实例希尔排序算法定义:希尔排序是插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。算法思想:希尔排序是把
本文实例讲述了C++实现的归并排序算法。分享给大家供大家参考,具体如下:归并排序归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法。该算法是
sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。sort函数进行排序的时间复杂度为n*log2n,比冒泡之类的排序算法效率要