#include<iostream>
#define MAX 100
using namespace std;
//倒序排列
//选择排序 简单选择排序|二元选择排序|堆排序
void simpleSort(int *arr,int length){
int i,j;
i=j=0;
for(i=0;i<length-1;i++){
for(j=i+1;j<length;j++){
//降序排列
if(arr[i]<arr[j]){
arr[i]^=arr[j];
arr[j]^=arr[i];
arr[i]^=arr[j];
}
}
}
}
//插入排序 直接插入排序和希尔排序
//直接插入排序
void insertSort(int *arr,int length){
int i;
for(i=1;i<length;i++){
if(arr[i]>arr[i-1]){
int x=i;
int temp = arr[i];
while((x>=1) && (arr[x-1]<temp)){
arr[x]=arr[x-1];
x--;
}
arr[x]=temp;
}
}
}
void ShellInsertSort(int *arr, int length, int dk)
{
for(int i= dk; i<length; i++){
if(arr[i] > arr[i-dk]){ //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入
int x=i;
int temp = arr[i];
while((x>=dk) && (arr[x-dk]<temp)){
arr[x]=arr[x-dk];
x-=dk;
}
arr[x]=temp;
}
}
}
/**
* 先按增量d(n/2,n为要排序数的个数进行希尔排序
*
*/
void shellSort(int *arr, int length){
int dk = length/2;
while( dk >= 1 ){
ShellInsertSort(arr, length, dk);
dk = dk/2;
}
}
//交换排序 冒泡排序,快速排序
void bubbleSort(int *arr,int length){
int i,j;
for(i=1;i<length;i++){
for(j=0;j<length-i;j++){
if(arr[j+1]>arr[j]){
arr[j]^=arr[j+1];
arr[j+1]^=arr[j];
arr[j]^=arr[j+1];
}
}
}
}
//快速排序
void quicksort(int *arr, int left, int right){
if(left < right){
int key = arr[left];
int low = left;
int high = right;
while(low < high){
while(low < high && arr[high] < key){
high--;
}
arr[low] = arr[high];
while(low < high && arr[low] > key){
low++;
}
arr[high] = arr[low];
}
arr[low] = key;
quicksort(arr,left,low-1);
quicksort(arr,low+1,right);
}
}
/********************************************************
*函数名称:Merge
*参数说明:pDataArray 无序数组;
* int *pTempArray 临时存储合并后的序列
* bIndex 需要合并的序列1的起始位置
* mIndex 需要合并的序列1的结束位置
并且作为序列2的起始位置
* eIndex 需要合并的序列2的结束位置
*说明: 将数组中连续的两个子序列合并为一个有序序列
*********************************************************/
void Merge(int* pDataArray, int *pTempArray, int bIndex, int mIndex, int eIndex)
{
int mLength = eIndex - bIndex; //合并后的序列长度
int i = 0; //记录合并后序列插入数据的偏移
int j = bIndex; //记录子序列1插入数据的偏移
int k = mIndex; //记录子序列2掺入数据的偏移
while (j < mIndex && k < eIndex)
{
if (pDataArray[j] <= pDataArray[k])
{
pTempArray[i++] = pDataArray[j];
j++;
}
else
{
pTempArray[i++] = pDataArray[k];
k++;
}
}
if (j == mIndex) //说明序列1已经插入完毕
while (k < eIndex)
pTempArray[i++] = pDataArray[k++];
else //说明序列2已经插入完毕
while (j < mIndex)
pTempArray[i++] = pDataArray[j++];
for (i = 0; i < mLength; i++) //将合并后序列重新放入pDataArray
pDataArray[bIndex + i] = pTempArray[i];
}
/********************************************************
*函数名称:BottomUpMergeSort
*参数说明:pDataArray 无序数组;
* iDataNum为无序数据个数
*说明: 自底向上的归并排序
*********************************************************/
void BottomUpMergeSort(int* pDataArray, int iDataNum)
{
int *pTempArray = (int *)malloc(sizeof(int) * iDataNum); //临时存放合并后的序列
int length = 1; //初始有序子序列长度为1
while (length < iDataNum)
{
int i = 0;
for (; i + 2*length < iDataNum; i += 2*length)
Merge(pDataArray, pTempArray, i, i + length, i + 2*length);
if (i + length < iDataNum)
Merge(pDataArray, pTempArray, i, i + length, iDataNum);
length *= 2; //有序子序列长度*2
}
free(pTempArray);
}
void printArr(int *arr,int length){
int i;
for(i=0;i<length;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
}
int main()
{
int arr[MAX]={23,13,42,63,3,24,262,52,7,85,43,90};
int length = 12;
printArr(arr,length);
BottomUpMergeSort(arr,length);
printArr(arr,length);
}
排序算法
最新推荐文章于 2022-04-27 23:04:16 发布