#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<chrono>
#include<string>
using namespace std;
const int MAX_NUM = 1000;
void SelectSort(int *a, int n) {
for (int i = 0;i < n;i++) {
int min = i;
for (int j = i + 1;j < n;j++) {
if (a[j] < a[min]) {
min = j;
}
}
int tmp = a[min];
a[min] = a[i];
a[i] = tmp;
}
}
void InsertSort(int *a, int n) {
for (int i = 1;i < n;i++) {
for (int j = i;a[j] < a[j - 1] && j >= 0;j--) {
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
void HillSort(int *a, int n) {
int h = 1;
while (h < n / 3) {
h = 3 * h + 1;
}
while (h >= 1) {
for (int i = h;i < n;i++) {
for (int j = i;j >= h && a[j] < a[j - h];j -= h) {
int temp = a[j];
a[j] = a[j - h];
a[j - h] = temp;
}
}
h = h / 3;
}
}
void merge(int *a, int *b, int lo, int mid, int hi) {
int i = lo, j = mid + 1;
for (int k = lo;k <= hi;k++) {
b[k] = a[k];
}
for (int k = lo;k <= hi;k++) {
if (i > mid)a[k] = b[j++];
else if (j > hi)a[k] = b[i++];
else if (b[i] < b[j])a[k] = b[i++];
else a[k] = b[j++];
}
}
void mergeSort(int *a, int low, int hi, int *b) {
if (low >= hi)return;
int mid = (low + hi) / 2;
mergeSort(a, low, mid, b);
mergeSort(a, mid + 1, hi, b);
merge(a, b, low, mid, hi);
}
void MergeSort(int *a, int n) {
int *b = new int[n];
mergeSort(a, 0, n - 1, b);
}
int partition(int *a, int st, int end) {
int k = a[end];
int i = st, j = end - 1;
while (i < j) {
while (a[i] <= k && i <= j) {
i++;
}
while (a[j] > k &&i < j) {
j--;
}
if (i < j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
if (k < a[i]) {
a[end] = a[i];
a[i] = k;
}
return i;
}
void quickSort(int *a, int st, int end) {
if (st >= end)return;
int k = partition(a, st, end);
quickSort(a, st, k - 1);
quickSort(a, k + 1, end);
}
void QuickSort(int *a, int n) {
quickSort(a, 0, n - 1);
}
void adjustHeap(int *a, int n, int node) {
while (node < n / 2) {
int child = 2 * node + 1;
if (child + 1 < n &&a[child] <= a[child + 1]) {
child += 1;
}
if (a[node] < a[child]) {
int k = a[child];
a[child] = a[node];
a[node] = k;
}
else {
break;
}
node = child;
}
}
void makeHeapSort(int *a, int n) {
for (int i = n / 2;i >= 0;i--) {
adjustHeap(a, n, i);
}
}
void HeapSort(int *a, int n) {
makeHeapSort(a, n);
for (int i = n - 1;i > 0;i--) {
int tmp = a[0];
a[0] = a[i];
a[i] = tmp;
adjustHeap(a, i, 0);
}
}
bool isSort(int *a,int n) {
for (int i = 0;i < n - 1;i++) {
if (a[i] > a[i + 1]) {
cout << "No sort" << endl;
return false;
}
}
return true;
}
void produceData(int *a) {
int *b = new int[MAX_NUM];
for (int i = 0;i < MAX_NUM;i++) {
b[i] = i;
}
int l = MAX_NUM;
int cu = 0;
int tmp = 0;
for (int i = 0;i < MAX_NUM;i++) {
cu = rand() % l;
a[i] = b[cu];
tmp = b[l - 1];
b[l - 1] = b[cu];
b[cu] = tmp;
l--;
}
}
void copyArray(int *a,int *b) {
for (int i = 0;i < MAX_NUM;i++) {
b[i] = a[i];
}
}
void prinArray(int *a,int n) {
for (int i = 0;i < n;i++) {
cout << a[i] << " ";
}
cout << endl;
}
void staticTime(int *a,string desc, void(*func)(int *, int)) {
int *b = new int[MAX_NUM];
copyArray(a, b);
chrono::milliseconds start = chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now().time_since_epoch());
func(b, MAX_NUM);
chrono::milliseconds end = chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now().time_since_epoch());
cout << desc << " time is :" << end.count() - start.count() << endl;
isSort(b, MAX_NUM);
}
void BinarySearch(int *a, int n,int k) {
int lo = 0, hi = n - 1;
int mid = 0;
while (lo<=hi) {
mid = lo + (hi - lo) / 2;
if (k < a[mid]) {
hi = mid - 1;
}
else if (k > a[mid]) {
lo = mid + 1;
}
else {
lo = mid;
break;
}
}
cout << "Find value k in " << lo << endl;
cout << k << endl;
}
int main() {
srand(time(NULL));
int *a = new int[MAX_NUM];
produceData(a);
staticTime(a, "SelectSort", SelectSort);
BinarySearch(a, MAX_NUM, a[0]);
}