排序

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值