// 算法.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std;
void QuickSort(int e[], int first, int end);
int _tmain(int argc, _TCHAR* argv[])
{
srand(unsigned(time(NULL)));//set 种子
int t_nArray[10];
//产生随即数组
for(int i = 0; i < 10; i++)
{
t_nArray[i] = rand()%100;
}
//快速排序
QuickSort(t_nArray, 0, 9);
//显示数组
for(int i = 0; i < 10; i++)
{
cout << t_nArray[i] ;
cout << "," ;
}
system("pause");
return 0;
}
void QuickSort(int e[], int first, int end)
{
int i=first,j=end;
int temp=e[first];//记录第一个数据
while(i<j)
{
while(i<j && e[j]>=temp) //与first数据比较,右边下标逐渐左移
j--;
e[i]=e[j];
while(i<j && e[i]<=temp) //与first数据比较,左边下标逐渐右移
i++;
e[j]=e[i];
}
e[i]=temp; //将first数据放置于i=j处
if(first<i-1)
QuickSort(e,first,i-1);
if(end>i+1)
QuickSort(e,i+1,end);
}
链表 快排
void list::PriorSort(node* &head, node* &end)
{
node *head1, *head2, *end1, *end2; //记录每次分割后前后两个链表的头尾节点
head1 = head2 = end1 = end2 = NULL;
if( head == NULL )
return; //如果遍历的当前节点为空,返回
node *p, *pre1, *pre2; //用于遍历链表将链表中的元素分成大于key和小于key两个部分
p = pre1 = pre2 = NULL;
int key = head->priority;
p = head->nextNode;
head->nextNode = NULL; //将head的值孤立出来
while( p != NULL )
{
//小于key的链表
if ( p->priority < key ){
if( !head1 )
{
head1 = p;
pre1 = p;
}
else{
pre1->nextNode = p;
pre1 = p;
}
p = p->nextNode;
pre1->nextNode = NULL;
}
//大于等于key的链表
else
{
if( !head2 )
{
head2 = p;
pre2 = p;
}
else
{
pre2->nextNode = p;
pre2 = p;
}
p = p->nextNode;
pre2->nextNode = NULL;
}
}
end1 = pre1;
end2 = pre2; //产生新链表的首尾节点
//对左右两个链表进行递归快排
PriorSort(head1, end1);
PriorSort(head2, end2);
//从递归栈返回的时候,将key节点和左右两个链表连起来
//左右链表都存在
if( end1 && head2)
{
end1->nextNode = head;
head->nextNode = head2;
head = head1;
end = end2;
}
//只有左链表
else if(end1)
{
end1->nextNode = head;
end = head;
head = head1;
}
//只有右链表
else if(head2)
{
head->nextNode = head2;
end = end2;
}
}