Sort好好复习了一下,不容易啊...
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*
made by davidsu33 2017-6-14
*/
#define MAX_SHOW_COUNT 100
//#define USE_DEPNUMS
constexpr int sortCount{200000000};
using namespace std;
typedef int DataType;
typedef function SortFunc;
template
void dumpData(Iterator start, Iterator end)
{
std::copy(start, end, ostream_iterator(cout, ","));
cout< m_data;
bool m_showData {true};
};
void SortModel::sort()
{
if(!m_sortFunc){
return;
}
shuffleData();
cout<<"数据个数:"< m_data[i])
{
assert(false);
cout<<"排序错误!!!"<(cout, ","));
cout< arr[1])
swap(arr[0], arr[1]);
}
}
//插入排序
void insert_sort(DataType *arr, int length)
{
if(length <= 2) {
return common_sort(arr, length);
}
show_sort_name("插入排序");
DataType tmp{0};
int j{0};
for(int i=1; i=0 && arr[j] > tmp; --j)
{
arr[j+1] = arr[j];
}
arr[j+1] = tmp;
}
}
//Shell排序
void shell_sort(DataType *arr, int length)
{
if(length <= 2)
return common_sort(arr, length);
show_sort_name("希尔排序");
DataType tmp{0};
int i{0},j{0}, span= length/2;
while(span >= 1)
{
for(i=span; i=0 && tmp < arr[j]; j-=span)
{
arr[j+span] = arr[j];
}
arr[j+span] = tmp;
}
span /= 2;
}
}
/*!冒泡排序的特点,起点相同,终点的和等于length-1*/
//冒泡排序,往左冒泡
void bubble_sort_left(DataType *arr, int length)
{
if(length <= 2)
return common_sort(arr, length);
show_sort_name("冒泡排序");
for(int i=length-1; i>0; --i)
{
for(int j=length-1; j>length-1-i; --j)
{
if(arr[j] < arr[j-1])
{
swap(arr[j], arr[j-1]);
}
}
}
}
//冒泡排序,往右冒泡
void bubble_sort_right(DataType *arr, int length)
{
if(length <= 2) return common_sort(arr, length);
show_sort_name("冒泡排序");
for(int i=0; i arr[j])
...
}
貌似第一眼很对,但是??,该数据达不到最后一个值,
排序一定要考虑边界问题,上面的写法改成
for(int j=1; j arr[j])
同样是正确的
*/
for(int j=0; j arr[j+1])
swap(arr[j], arr[j+1]);
}
}
}
//冒泡排序
void bubble_sort(DataType *arr, int length)
{
bubble_sort_right(arr, length);
}
/*ERROR It's not bubble sort
void bubble_sort_optimize(DataType *arr, int length)
{
if(length <= 2) return common_sort(arr, length);
show_sort_name("冒泡排序(标志位优化)");
bool flag {false};
for(int i=0; i arr[j])
{
swap(arr[i], arr[j]);
flag = false;
}
}
if(flag)
break;
}
}
*/
void bubble_sort_optimize(DataType *arr, int length)
{
if(length <= 2) return common_sort(arr,length);
show_sort_name("冒泡排序(标志位优化)");
bool flag{false};
for(int i=0; i arr[j+1])
{
swap(arr[j], arr[j+1]);
flag = false;
}
}
if(flag) break;
}
}
//快速排序
void quick_sort_private(DataType *arr, int l, int r)
{
if(l >= r) return;
int index = (l+r)/2;
const int tmp{arr[index]};
/*!
找到适合于tmp值自己的位置
*/
int i{l}, j{r};
while(i < j)
{
for(; i tmp)
{
arr[index] = arr[i];
index = i;
//cout<<"arr[i]>tmp"<<"("<"<index; --j)
{
if(arr[j] < tmp)
{
arr[index] = arr[j];
index = j;
//cout<<"arr[j]>tmp"<<"("<= high)
{
return;
}
int first = low;
int last = high;
int key = a[first];/*用字表的第一个记录作为枢轴*/
cout<<"need to find key= "<