?? 1.cpp
字號:
第一種算法為選擇排序,二為插入排序,三是冒泡排序,六是二分法插入排序,隨機產(chǎn)生了10000個數(shù)字
#include "stdafx.h"
#include <iostream>
#include "windows.h"
#include "stdlib.h"
#include "time.h"
using namespace std;
const int count = 10000;
const int SELECT = 1;
const int INSERT = 2;
const int BUBBLE = 3;
const int HEAP = 4;
const int QUICK = 5;
const int BIINSERT =6;
void QuickSort(int a[],int start,int end)
{
int i,j;
if(start<end)
{
i = start;
j = end;
long lTemp = a[start];
do
{
while(i<j&&lTemp<a[j]) j--; //從最右開始找位置
if(i<j) //與左邊交換后掉頭
{
swap(a[j],a[i]);
i++;
}
while(i<j&&a[i]<lTemp) i++; //從左邊找
if(i<j)
{
swap(a[j],a[i]);
j--;
}
} while(i<j); //最終找到定位的地方
a[i] = lTemp; //元素放入,分成兩個序列
QuickSort(a,start,i-1); //左邊序列
QuickSort(a,i+1,end); //右邊序列
}
}
void swap(int &a,long &b)
{
long lTemp;
lTemp = a;
a = b;
b = lTemp;
}
void sort(int a[],int count,int lMethod)
{
switch(lMethod)
{
case SELECT:
{
//Selected Sort
for(int i=0;i<count;i++)
{
for(int j = i+1;j<count;j++)
{
if(a[j]>a[i])
{
swap(a[j],a[i]);
}
}
}
}
break;
case INSERT: //Insert Sort
{
long lTemp;
for(int i = 0;i<count;i++)
{
int j = i+1;
long lTemp = a[j] ; //
while(j>0&&lTemp<a[j-1])
{
a[j] = a[j-1];
j--;
}
a[j] = lTemp;
}
}
break;
case BUBBLE: //Bubble Sort
{
for(int i = 0;i< count;i++)
{
for(int j=i+1;j<count;j++)
{
if(a[j]<a[j-1])
{
long lTemp;
lTemp = a[j];
a[j]= a[j-1];
a[j-1] = lTemp;
}
}
}
}
break;
case HEAP: //Heap Sort
{
}
break;
case QUICK: //Quick Sort
{
QuickSort(a,0,count-1);
}
break;
case BIINSERT:
{
long lTemp;
for(int i = 0;i<count;i++)
{
int j = i+1;
long lTemp = a[j] ;
int k,m,n;
m = 0;n = j;
k = (m+n)/2;
while(m<n)
{
if(lTemp>a[k])
m = k+1;
else
n = k-1;
k = (m+n)/2;
}
for(int L=j ; L>k ; L--)
{
a[L] = a[L-1];
}
a[L] = lTemp;
}
}
break;
}
}
int main(int argc, char* argv[])
{
int a[count];
int b[count];
srand( (unsigned)time( NULL ) );
long lNum = 0;
for( int i = 0; i < count;i++ )
{
lNum = rand()%count;
if(i%10==0)
printf("\n");
printf( " %6d", lNum );
a[i] = lNum;
b[i] = lNum;
}
printf("\n");
long lStart = GetTickCount();
sort(a,count,1);
long lEnd = GetTickCount();
cout<<"SELECT sort times= "<<( lEnd - lStart)<<" uMinutes \n";
for( i = 0; i < count;i++ )
{
a[i] = b[i];
}
lStart = GetTickCount();
sort(a,count,2);
lEnd = GetTickCount();
cout<<"INSERTsort times= "<<( lEnd - lStart)<<" uMinutes \n";
for( i = 0; i < count;i++ )
{
a[i] = b[i];
}
lStart = GetTickCount();
sort(a,count,3);
lEnd = GetTickCount();
cout<<"BUBBLE sort times= "<<( lEnd - lStart)<<" uMinutes \n";
for( i = 0; i < count;i++ )
{
a[i] = b[i];
}
lStart = GetTickCount();
sort(a,count,6);
lEnd = GetTickCount();
cout<<"BIINSERT sort times= "<<( lEnd - lStart)<<" uMinutes \n";
for( i = 0; i < count;i++ )
{
a[i] = b[i];
}
lStart = GetTickCount();
sort(a,count,5);
lEnd = GetTickCount();
cout<<"QUICK sort times= "<<( lEnd - lStart)<<" uMinutes \n";
for( int j = 0; j < count;j++ )
{
// if(j%10==0)
// printf("\n");
// printf( " %6d", a[j] );
}
return 0;
}
下面是測試結(jié)果:
一次:
SELECT sort times= 1078 uMinutes
INSERTsort times= 156 uMinutes
BUBBLE sort times= 438 uMinutes
BIINSERT sort times= 141 uMinutes
QUICK sort times= 0 uMinutes
二次:
SELECT sort times= 1047 uMinutes
INSERTsort times= 156 uMinutes
BUBBLE sort times= 453 uMinutes
BIINSERT sort times= 141 uMinutes
QUICK sort times= 0 uMinutes
三次:
SELECT sort times= 1063 uMinutes
INSERTsort times= 156 uMinutes
BUBBLE sort times= 437 uMinutes
BIINSERT sort times= 141 uMinutes
QUICK sort times= 15 uMinutes
從測試結(jié)果中可以看到,數(shù)據(jù)量大的時候,二分法插入排序的性能較好。快速排序最佳
冒泡排序由于是穩(wěn)定的排序方法,排序性能適中,比較適合使用,當數(shù)據(jù)量大、不要求穩(wěn)定排序時可以考慮二分法或快速,堆排序。
小數(shù)據(jù)量時用插入或冒泡排序就夠了,針對隨機數(shù),通常不要使用選擇排序。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -