#pragma once
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
void swap(int &a,int &b)
{
int temp = a;
a = b;
b = temp;
}
//快速排序
int Partition(int *array, int low, int high)
{
int index = array[low];
while (low < high)
{
while(array[high]>=index && low < high) {
high--;
}
array[low] = array[high];
while (array[low]<=index && low < high) {
low++;
}
array[high] = array[low];
}
array[low] = index;
/*
for (int i = 0; i < 10; i++)
{
cout << array[i] << " ";
}
cout << endl;
system("pause");
*/
return low;
}
int Partition_2(int *array, int low, int high)
{
int index=array[low];
int index2=low;
low++;
while (low < high)
{
while (array[high]>index && low < high)
{
high--;
}
while (array[low] < index && low < high)
{
low++;
}
swap(array[low], array[high]);
}
swap(array[index2],array[low]);
return low;
}
void QuickSort(int *array,int low,int high)
{
if (low < high)
{
int pivlot = Partition_2(array,low,high);
QuickSort(array,low,pivlot-1);
QuickSort(array,pivlot+1,high);
}
}
//耗时2小时调试完毕;晕
//归并排序
//合并数组,问题待解决
void Merge(int *array,int low,int high)
{
cout << low << " " << high << endl;
int mid = (low + high) / 2;
int low2 = mid + 1;
int temp;
//只有一个元素的时候,会产生数组溢出,需要保证low2小于等于high。
//要确保第一个数组非空,所以要加low<=mid,空了就退出循环。
while(low2<=high && mid<low2 && low<=mid)
{
if (array[low] > array[low2])
{
temp = array[low2];
//需要从后往前赋值,避免元素覆盖
for (int i = low2; i >low; i--)
{
array[i] = array[i-1];
}
array[low] = temp;
low2++;
low++;
mid++;
}
else
{
low++;
}
}
for (int i = 0; i < 10; i++)
{
cout << array[i] << " ";
}
cout << endl;
//cout << low << " " << high << endl;
system("pause");
}
void MergeSort(int *array,int low,int high)
{
if (low < high)
{
int mid = (low + high) / 2;
MergeSort(array, low, mid);
MergeSort(array, mid + 1, high);
Merge(array, low, high);
}
}
//堆排序,留待以后。
//堆排序。7月26日,即次日补上。
void MergeSort(int *array,int low,int high)
{
if (low < high)
{
int mid = (low + high) / 2;
MergeSort(array, low, mid);
MergeSort(array, mid + 1, high);
Merge(array, low, high);
}
}
//堆排序
void AdjustDown(int *array, int i, int len)
{
int temp;
if (len > 2 * i)
{
if (array[2 * i] > array[2 * i + 1])
temp = 2 * i;
else temp = 2 * i + 1;
}
else if(2*i == len)
{
temp = 2 * i;
}
if (array[i] < array[temp])
{
array[0] = array[i];
array[i] = array[temp];
array[temp] = array[0];
}
}
void BuildHeap(int *array, int len)
{
for (int i = len / 2; i > 0; i--)
{
AdjustDown(array, i, len);
}
}
void HeapSort(int *array,int len)
{
while (len > 0)
{
BuildHeap(array,len);
array[0] = array[len];
array[len--] = array[1];
array[1] = array[0];
}
}
#include "SortList.h"
int main()
{
int array[10] = {1999,224,27819,65,1,98,652,25434,186,2671};
MergeSort(array,0,9);
for (int i = 0; i < 10; i++)
{
cout << array[i] << " ";
}
system("pause");
return 0;
}