// Win32_Console.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
using namespace std;
#define MAXSIZE 20
#define MAXUINT ( (UINT)(~((UINT)0)) )
#define MAXINT ( (INT)(MAXUINT >>1) )
#define MININT ( (INT)(~MAXINT) )
typedef int KeyType;
typedef struct _RedType{
KeyType key;
int next;
_RedType operator = ( _RedType& r){
key=r.key;
next=r.next;
return (*this);
}
BOOL operator < ( _RedType& r ){
return (key < r.key)?true:false;
}
BOOL operator > ( _RedType& r ){
return (key > r.key)?true:false;
}
}RedType;
/// 插入(直接,折半,二路,表插入,希尔),交换(冒泡,快排),/
/ 选择(简单,树形,堆),归并,基数
typedef struct _Sqlist{
RedType r[MAXSIZE+2];
int length;
_Sqlist(CString& str){
int i=1;
while(!str.IsEmpty()){
int flag=str.Find(_T(" ") );
r[i].key=_tstoi(str.Left(flag).GetBuffer() );
if(flag<0){
r[i].key=_tstoi(str.GetBuffer() );
break;
}
str=str.Right(str.GetLength()-flag-1);
i++;
}
length=i;
};
void print(){
int i;
for(i=1;i<length;i++)
cout<<r[i].key<<" ";
cout<<r[i].key<<endl;
}
void InsertSort(){ // 直接插入排序 O(n^2)
int i,j;
for(i=2;i<length+1;i++){
if(r[i]<r[i-1]){
r[0]=r[i];
r[i]=r[i-1];
for(j=i-2;r[0]<r[j];j--)
r[j+1]=r[j];
r[j+1]=r[0];
}
}
}
void BInsertSort(){ // 折半插入排序 O(n^2) 减少了查找次数
int i,j;
for(i=2;i<length+1;i++){
r[0]=r[i];
int low=1,high=i-1,mid;
while(low<=high){
mid=(low+high)/2;
if(r[mid]>r[0])
high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>=high+1;j--) r[j+1]=r[j];
r[high+1]=r[0];
}
}
void TwoPathInsertSort(){ // 2-路插入排序 O(n^2/8)
int swap[MAXSIZE],i,j,first,final;
swap[1]=r[1].key;
final=1;
first=length+1;
swap[first]=MAXINT;
for(i=2;i<=length;i++){
if(r[i].key>swap[1]){ //左半边插入
final++;
j=final;
while(r[i].key<swap[j-1]){
swap[j]=swap[j-1];
j--;
}
swap[j]=r[i].key;
}else{ //右半边插入
first--;
j=first;
while(r[i].key>swap[j+1]){
swap[j]=swap[j+1];
j++;
}
swap[j]=r[i].key;
}
}
/ swap[]内的数据写入Sqlist ///
j=0;
for(i=first;i<=length;i++){
j++;
r[j].key=swap[i];
}
for(i=1;j<=length;i++){
j++;
r[j].key=swap[i];
}
}
void TableInsertSort(){ // 表插入排序 O(n^2) 最多3*(n-1)次移动。。。现行移动次数
//第一步:排序
r[0].next=1;r[0].key=MAXINT;
r[1].next=0;
int p,q; 指针
int i;
for(i=2;i<=length;i++){
p=0;
do{
if(r[i] < r[ r[p].next ]){
r[i].next = r[p].next;
r[p].next=i;
break;
}
p=r[p].next;
}while(1);
}
/第二步:重排
p=r[0].next;
for(i=1;i<length;i++){
while(p<i) p=r[p].next;
q=r[p].next;
if(p!=i){
_RedType swap=r[p];
r[p]=r[i];
r[i]=swap;
r[i].next=p;
}
p=q;
}
}
void BubbleSort(){ //a ^=(b ^= (a ^= b)); ; //最快O(n-1),交换0次;最慢O(n*(n-1)/2),交换相同次数
int i,j;
BOOL change=true;
for(i=length;i>1 && change;i--){
change = false;
for(j=1;j<i;j++){
if(r[j]>r[j+1]){
r[j].key ^=(r[j+1].key ^=(r[j].key ^=r[j+1].key) );
change=true;
}
}
}
}
void SelectSort(){ //选择排序
int i,j,min;
for(i=1;i<length;i++){
min=i;
for(j=i+1;j<=length;j++){
if(r[min]>r[j])
min=j;
}
r[min].key ^=(r[i].key ^=(r[min].key ^=r[i].key) );
}
}
void QuickSort(int low,int high){
if(low>=high) return;
int i,j;
_RedType tmp;
i=low;j=high;
tmp=r[low];
while(i<j){
while(r[j]>=tmp && i<j) j--;
r[i]=r[j];
while(r[i]<=tmp && i<j) i++;
r[j]=r[i];
}
r[i]=tmp;
QuickSort(low,i-1);
QuickSort(i+1,high);
}
}Sqlist;
int main()
{
Sqlist l(CString("49 38 65 97 76 13 27 49") );
l.print();
//l.InsertSort();
//l.BInsertSort();
//l.TwoPathInsertSort();
//l.TableInsertSort();
//l.BubbleSort();
//l.SelectSort();
l.QuickSort(1,l.length);
l.print();
return 0;
}