// sort.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
using namespace std;
template
void print(T* &arr,int len) {
for (int i=0;i
void select_sort(T* &array,int len){
if (NULL == array)
{
cout<<"#ERROR "<<__FILE__<<" Line:"<<__LINE__<<" null point error"< array[j])
swap(array[i],array[j]);
}
//冒泡排序
/*
1.BUBBLE相邻2个元素比较,大则交换
每一次使得最大的值到最上面
*/
template
void bubble_sort(T* &array,int len){
if (NULL == array)
{
cout<<"#ERROR "<<__FILE__<<" Line:"<<__LINE__<<" null point error"< array[j+1])
{
flag = false;
swap(array[j],array[j+1]);
}
if (flag) break;
}
}
//插入排序
/*
1.i属于[1,len)从i位置往前判断j属于[0,i)
则后一个元素与前一个相比小于则替换,大于等于退出第一个循环
*/
template
void insert_sort(T* &array,int len){
if (NULL == array)
{
cout<<"#ERROR "<<__FILE__<<" Line:"<<__LINE__<<" null point error"<= array[j-1])
break;
swap(array[j],array[j-1]);
}
}
}
//归并排序
/*
用到二分思想将数据递归成左右2边得到链表A,B
1.链表A,B用链表归并来得到新的有序链表
*/
template
void merge(T* &array,int left,int mid,int right,T* temp){
int i = left;
int j = mid+1;
int k = 0;
while (i<=mid && j<=right)
{
if (array[i] > array[j])
temp[k++] = array[j++];
else
temp[k++] = array[i++];
}
//追加最后
while (i <= mid)
temp[k++] = array[i++];
while (j<=right)
temp[k++] = array[j++];
//临时变量copy到元素组中
k = 0;
while(left<=right)//没注意写成k<=right 调试了半天。 数据变成大数考虑是否赋值越界
array[left++] = temp[k++];
}
template
void merger_sort(T* &array,int left,int right,T* temp){
if (left < right)
{
int mid = (left + right)/2;
merger_sort(array,left,mid,temp);//排序左边子序列
merger_sort(array,mid+1,right,temp);//排序右边子序列
merge(array,left,mid,right,temp);//左右2边归并
}
}
template
void merger_sort(T* &array,int len){
if (NULL == array)
{
cout<<"#ERROR "<<__FILE__<<" Line:"<<__LINE__<<" null point error"<(array,0,len-1,temp);
if (NULL != temp)
{
delete[] temp;
temp = NULL;
}
}
//快排
/*
(一)挖坑填坑
1.以第一个元素为基准X 初始值前缀i = left 后缀j = right
2.后缀从后往前查找j元素值 < X;i处 赋值 j元素值
3.前缀从前往后查找i元素值 > X;j处 赋值 i元素值
重复第2,3步
(二)分治
1.左边[left,i)执行(一)
2.右边(i,right]执行(一)
递归执行1,2
*/
template
int dig_fil(T* &array,int left,int right){
T X = array[left];
int i = left;
int j = right;
while (ii && array[j] >= X)j--;
if (j>i)//只有满足后缀大于前缀才能赋值 不然会数组越界
{
array[i] = array[j];
i++;
}
while(i
void quick_sort(T* &array,int left,int right){
if (left < right)
{
int mid = dig_fil(array,left,right);
quick_sort(array,left,mid-1);
quick_sort(array,mid+1,right);
}
}
template
void quick_sort(T* &array,int len){
if (NULL == array)
{
cout<<"#ERROR "<<__FILE__<<" Line:"<<__LINE__<<" null point error"<
void adjust(T* &array,int sign,int len){
T temp = array[sign];
//每一次循环都更新该父节点为根的完全二叉树最大堆
for (int i = sign * 2 + 1; i < len; i = i * 2 + 1){
if (i + 1 < len && array[i + 1] > array[i])
i++;
//判断子节点 大于父节点
if (array[i] > temp){
array[sign] = array[i];
sign = i;
}
}
array[sign] = temp;
}
template
void heap_sort(T* &array,int len){
//1.从所有非叶子节点 构建初始大顶堆
for (int i = len / 2 - 1; i >= 0; i--){
adjust(array, i, len);
}
//
for (int i = len - 1; i; i--){
//2.交换最大堆 和 相对的最后一个元素
swap(array[i],array[0]);
//3.重新调整堆结构
adjust(array, 0, i);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = {1,5,4,9,0,2,3,6,8,7};
int* pa = a;
//select_sort(pa,10);
//bubble_sort(pa,10);
//insert_sort(pa,10);
//merger_sort(pa,10);
//quick_sort(pa,10);
//heap_sort(pa,10);
print(pa,10);
getchar();
return 0;
}