#include <iostream>
using namespace std;
void BubbleSort(int *arr, int Count) //冒泡排序
{
if (arr == NULL || Count <= 0)
{
return;
}
int i, j;
for (i = 0; i < Count; i++)
{
int temp = 0;
for (j = 0; j < Count - i - 1; j++)
{
if (arr[j + 1] < arr[j])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return;
}
void SelectSort(int *arr, int Count) //选择排序
{
int iTemp;
int iPos;
if (arr == NULL && Count <= 1)
{
return;
}
for (int i = 0; i < Count - 1; i++)
{
iTemp = arr[i];
iPos = i;
for (int j = i + 1; j < Count; j++)
{
if (iTemp > arr[j])
{
iTemp = arr[j];
iPos = j;
}
}
arr[iPos] = arr[i];
arr[i] = iTemp;
}
}
void InsertSort(int *arr, int Count) //直接插入排序
{
int iTemp;
int iPos;
if (arr == NULL && Count <= 1)
{
return;
}
for (int i = 1; i < Count; i++)
{
iTemp = arr[i];
iPos = i - 1;
while ((iPos >= 0) && (iTemp < arr[iPos]))
{
arr[iPos + 1] = arr[iPos];
iPos--;
}
arr[iPos + 1] = iTemp;
}
}
void CockTail(int *arr, int size) //鸡尾酒排序(改进的冒泡排序,也叫双向冒泡排序)
{
int tail = size - 1;
int i, j;
for (i = 0; i < tail;)
{
for (j = tail; j > i; --j)
{
if (arr[j] < arr[j - 1])
{
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
++i;
for (j = i; j < tail; ++j)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
tail--;
}
}
void MergeArray(int a[], int first, int mid, int last)
{
int begin1 = first, begin2 = mid + 1;
int end1 = mid, end2 = last;
int k = 0;
int *temp = new int[last - first + 1];
while (begin1 <= end1 && begin2 <= end2)
{
if (a[begin1] <= a[begin2])
temp[k++] = a[begin1++];
else
temp[k++] = a[begin2++];
}
while (begin1 <= end1)
temp[k++] = a[begin1++];
while (begin2 <= end2)
temp[k++] = a[begin2++];
for (int i = 0; i < k; i++)
a[first + i] = temp[i];
delete []temp;
}
void MergeSort(int a[], int first, int last) //归并排序
{
if (first < last)
{
int mid = (first + last) / 2;
MergeSort(a, first, mid); //左边有序
MergeSort(a, mid + 1, last); //右边有序
MergeArray(a, first, mid, last); //再将二个有序数列合并
}
}
//Data swap function
void Swap(int &p,int &q)
{
int temp = p;
p = q;
q = temp;
}
//Partition function
int Partition(int *arr,int nLow,int nHigh)
{
int iTemp = arr[nHigh];
int i = nLow, j = nLow - 1;
for(; i < nHigh; i++)
{
if (arr[i] <= iTemp)
{
j++;
if(i != j)
{
Swap(arr[i], arr[j]);
}
}
}
Swap(arr[j + 1], arr[nHigh]);
return (j + 1);
}
//Quick sort
void QuickSort(int *arr,int nLow,int nHigh) //快速排序
{
if(nLow < nHigh)
{
int nIndex = Partition(arr , nLow, nHigh);
QuickSort(arr , nLow, nIndex-1);
QuickSort(arr , nIndex+1, nHigh);
}
}
void ShellSort(int arr[], int n, int gapMax) //希尔排序
{
int gap;
for(gap = gapMax; gap > 0; gap--)
{
for(int i = 0; i < gap; i++)
{
for(int j = i + gap; j < n; j = j + gap)
{
//if(arr[j] < arr[j-gap])
{
int iTemp = arr[j];
int iPos = j - gap;
while(iPos >= 0 && arr[iPos] > iTemp)
{
arr[iPos + gap] = arr[iPos];
iPos = iPos - gap;
}
arr[iPos + gap] = iTemp;
}
}
}
}
}
/*
输入:数组A,堆的长度hLen,以及需要调整的节点i功能:调堆
*/
void AdjustHeap(int A[], int hLen, int i)
{
int left = 2 * i; //节点i的左孩子
int right = (2 * i) + 1; //节点i的右孩子节点
int largest = i;
int temp;
while (left < hLen || right < hLen)
{
if (left < hLen && A[largest] < A[left])
{
largest = left;
}
if (right < hLen && A[largest] < A[right])
{
largest = right;
}
if (i != largest) //如果最大值不是父节点
{
temp = A[largest]; //交换父节点和和拥有最大值的子节点交换
A[largest] = A[i];
A[i] = temp;
i = largest; //新的父节点,以备迭代调堆
left = 2 * i; //新的子节点
right = (2 * i) + 1;
}
else
{
break;
}
}
}
/*
输入:数组A,堆的大小hLen
功能:建堆
*/
void BuildHeap(int A[], int hLen)
{
int i;
int begin = hLen / 2 - 1; //最后一个非叶子节点
for (i = begin; i >= 0; i--)
{
AdjustHeap(A, hLen, i);
}
}
/*
输入:数组A,待排序数组的大小aLen
功能:堆排序
*/
void HeapSort(int A[], int aLen) //堆排序
{
int hLen = aLen;
int iTemp;
BuildHeap(A, hLen); //建堆
while (hLen > 1)
{
iTemp = A[hLen - 1]; //交换堆的第一个元素和堆的最后一个元素
A[hLen - 1] = A[0];
A[0] = iTemp;
hLen--; //堆的大小减一
AdjustHeap(A, hLen, 0); //调堆
}
}
int main(int argc, char *argv[])
{
int arr[10] = {12, 25, 9, 39, 18, 0, 31, 16, 68, 46};
int i = 0;
cout << "Input the numbers:" << endl;
//for (i = 0; i < 10; i++)
//{
// cin >> arr[i];
//}
cout << "Before:" << endl;
for (i = 0; i < 10; i++)
{
cout << arr[i] << endl;
}
//BubbleSort(arr, 10);
//cout << "BubbleSort After:" << endl;
//for (i = 0; i < 10; i++)
//{
// cout << arr[i] << endl;
//}
//SelectSort(arr, 10);
//cout << "SelectSort After:" << endl;
//for (i = 0; i < 10; i++)
//{
// cout << arr[i] << endl;
//}
//InsertSort(arr, 10);
//cout << "InsertSort After:" << endl;
//for (i = 0; i < 10; i++)
//{
// cout << arr[i] << endl;
//}
//CockTail(arr, 10);
//cout << "CockTail After:" << endl;
//for (i = 0; i < 10; i++)
//{
// cout << arr[i] << endl;
//}
//MergeSort(arr, 0, 9);
//cout << "MergeSort After:" << endl;
//for (i = 0; i < 10; i++)
//{
// cout << arr[i] << endl;
//}
//QuickSort(arr, 0, 9);
//cout << "QuickSort After:" << endl;
//for (i = 0; i < 10; i++)
//{
// cout << arr[i] << endl;
//}
//ShellSort(arr, 10, 3);
//cout << "ShellSort After:" << endl;
//for (i = 0; i < 10; i++)
//{
// cout << arr[i] << endl;
//}
//HeapSort(arr, 10);
//cout << "HeapSort After:" << endl;
//for (i = 0; i < 10; i++)
//{
// cout << arr[i] << endl;
//}
int s;
cin >> s;
//getchar();
return 0;
}
排序
最新推荐文章于 2024-03-28 00:29:10 发布