李师兄给大家安排了新的内容,我这周的工作是看算法与数据结构。
今天看了第二节了,是快速排序的东西,在C下实现了两个小算法。记录下来以备后用。
下面的代码理解起来稍简单一点,但很明显速度不是最快的。
// 另一种实验方法:::::::::::::::::::::::::::::::::::::::::
// #include "stdafx.h"
// using namespace std;
///*swap: 交换v[i],v[j]*/
// void swap(int v[], int i, int j)
// {
// int temp;
// temp=v[i];
// v[i]=v[j];
// v[j]=temp;
// }
//
//
///*快速排序:将数组V[]进行升序排序*/
// void quicksort(int v[], int n)
// {
// int i,last;
// if(n <= 1) /*如果数组中元素个数小于1则什么也不作*/
// return;
// swap(v, 0, rand() % n); /*选数组中最后一个元素作基准,并将基准元素移到V[0]处*/
// last = 0;
// for(i = 1; i <n ; i++)
// {
// if(v[i] < v[0])
// swap(v, ++last, i);
// }
// swap(v, 0, last);
// quicksort(v, last);
// quicksort(v+last+1, n-last-1);
// }
//
// void main()
// {
// int a[]={4,6,9,5,7,8,1};
// quicksort(a,7);
// for (int i=0;i<7;i++)
// {
// cout<<a[i]<<endl;
// }
// }
//
今天看了第二节了,是快速排序的东西,在C下实现了两个小算法。记录下来以备后用。
#include
"
stdafx.h
"
using namespace std;
void run( int * pData, int left, int right)
{
int i,j;
int middle,iTemp;
i = left;
j = right;
middle = pData[(left+right)/2]; //求中间值
while(i<=j) //如果两边扫描的下标交错,就停止(完成一次)
{
while((pData[i]<middle) && (i<right)) //从左扫描小于中值的数 ?????????????
i++;
while((pData[j]>middle) && (j>left)) //从右扫描大于中值的数
j--;
if(i<=j)//找到了一对值
{
//交换
iTemp = pData[i];
pData[i] = pData[j];
pData[j] = iTemp;
i++;
j--;
}
}
//当左边部分有值(left<j),递归左半边
if(left<j)
run(pData,left,j);
//当右边部分有值(right>i),递归右半边
if(right>i)
run(pData,i,right);
}
void QuickSort( int * pData, int Count)
{
run(pData,0,Count-1);
}
void main()
{
int data[] = {4,6,9,5,7,8,10};
QuickSort(data,7);
for (int i=0;i<7;i++)
cout<<data[i]<<" ";
cout<<" ";
}
using namespace std;
void run( int * pData, int left, int right)
{
int i,j;
int middle,iTemp;
i = left;
j = right;
middle = pData[(left+right)/2]; //求中间值
while(i<=j) //如果两边扫描的下标交错,就停止(完成一次)
{
while((pData[i]<middle) && (i<right)) //从左扫描小于中值的数 ?????????????
i++;
while((pData[j]>middle) && (j>left)) //从右扫描大于中值的数
j--;
if(i<=j)//找到了一对值
{
//交换
iTemp = pData[i];
pData[i] = pData[j];
pData[j] = iTemp;
i++;
j--;
}
}
//当左边部分有值(left<j),递归左半边
if(left<j)
run(pData,left,j);
//当右边部分有值(right>i),递归右半边
if(right>i)
run(pData,i,right);
}
void QuickSort( int * pData, int Count)
{
run(pData,0,Count-1);
}
void main()
{
int data[] = {4,6,9,5,7,8,10};
QuickSort(data,7);
for (int i=0;i<7;i++)
cout<<data[i]<<" ";
cout<<" ";
}
下面的代码理解起来稍简单一点,但很明显速度不是最快的。
// 另一种实验方法:::::::::::::::::::::::::::::::::::::::::
// #include "stdafx.h"
// using namespace std;
///*swap: 交换v[i],v[j]*/
// void swap(int v[], int i, int j)
// {
// int temp;
// temp=v[i];
// v[i]=v[j];
// v[j]=temp;
// }
//
//
///*快速排序:将数组V[]进行升序排序*/
// void quicksort(int v[], int n)
// {
// int i,last;
// if(n <= 1) /*如果数组中元素个数小于1则什么也不作*/
// return;
// swap(v, 0, rand() % n); /*选数组中最后一个元素作基准,并将基准元素移到V[0]处*/
// last = 0;
// for(i = 1; i <n ; i++)
// {
// if(v[i] < v[0])
// swap(v, ++last, i);
// }
// swap(v, 0, last);
// quicksort(v, last);
// quicksort(v+last+1, n-last-1);
// }
//
// void main()
// {
// int a[]={4,6,9,5,7,8,1};
// quicksort(a,7);
// for (int i=0;i<7;i++)
// {
// cout<<a[i]<<endl;
// }
// }
//