C++中十種內部排序算法的比較分析
來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊: 次
C++中十種內部排序算法的比較分析
#include<iostream>
#include<ctime>
#include<fstream>
using namespace std;
#define MAXSIZE 1000 //可排序表的最大長度
#define SORTNUM 10 //測試10中排序方法
#define max 100 //基數(shù)排序時數(shù)據(jù)的最大位數(shù)不超過百位;
typedef struct node {
int data3;
int next;
} node;
typedef int DataType[MAXSIZE+2];
DataType data;
DataType data2;
DataType R1;
int size;//可排序表的長度
int head;
int fr[10];
int re[10];
long compCount;//統(tǒng)計比較次數(shù)
long shiftCount;//統(tǒng)計移動次數(shù)
void BeforeSort()//對比較次數(shù)和移動次數(shù)清零
{
compCount=0;
shiftCount=0;
}
bool Less(int i,int j)//若表中第i個元素小于第j個元素,則返回True,否則返回False
{
compCount++;
return data[i]<data[j];
}
void Swap(int i,int j)//交換表中第i個和第j個元素
{
int a;
a=data[i];
data[i]=data[j];
data[j]=a;
shiftCount=shiftCount+3;
}
void Shift(DataType &R,DataType &R2,int i,int j)//將R2[j]賦給R[i]
{
R[i]=R2[j];
shiftCount++;
}
void CopyData(DataType list1,DataType list2)
{
int i;
for(i=1;i<=size;i++) list2[i]=list1[i];
}
void InverseOrder()//將可排序表置為逆序
{
int i,j;
for(i=1,j=size;i<=size/2;i++,j--)
{
int a;
a=data[i];
data[i]=data[j];
data[j]=a;
}
CopyData(data,data2);
}
void RandomizeList()//由系統(tǒng)隨機一組數(shù)
{
int i;
srand(time(0));
for(i=1;i<=size;i++)
data[i]=rand()%(size+1);
CopyData(data,data2);
ofstream out_stream;
out_stream.open("input.txt",ios::app);
if(out_stream.fail())
{
cout<<"input file opening failed.\n";
exit(1);
}
for(i=1;i<=size;i++) out_stream<<data[i]<<" ";
out_stream<<"\n";
out_stream.close();
}
void RecallList()//恢復最后一次用RandomizeList隨機打亂的可排序表
{
CopyData(data2,data);
}
void output()//輸出函數(shù)
{
ofstream out_stream;
cout<<"\t"<<compCount<<"\t\t"<<shiftCount<<"\n";
out_stream.open("output.txt",ios::app);
if(out_stream.fail())
{
cout<<"Output file opening failed.\n";
exit(1);
}
out_stream<<"\t"<<compCount<<"\t\t"<<shiftCount<<"\n";
out_stream.close();
}
void BubbleSort()//冒泡排序
{
BeforeSort();
int swapped,i,m;
m=size-1;
do{
swapped=0;
for(i=1;i<=m;i++)
{
if(Less(i+1,i))
{
Swap(i+1,i);
swapped=1;
}
}
m--;
}while(swapped);
output();
}
void InsertSort() //插入排序
{
BeforeSort();
int i,j;
for(i=2;i<=size;i++)
{
Shift(data,data,0,i);
j=i-1;
while(Less(0,j))
{
Shift(data,data,j+1,j);
j--;
}
Shift(data,data,j+1,0);
}
output();
}
void SelectSort()//選擇排序
{
BeforeSort();
int i,j,min;
for(i=1;i<=size-1;i++)
{
min=i;
for(j=i+1;j<=size;j++)
if(Less(j,min)) min=j;
if(i!=min) Swap(i,min);
}
output();
}
int Partition(int low,int high)
{
int pivotkey;
Shift(data,data,0,low);
pivotkey=data[low];
while(low<high)
{
compCount++;
while(low<high&&data[high]>=pivotkey) {compCount++;--high;}
Shift(data,data,low,high);
compCount++;
while(low<high&&data[low]<=pivotkey) {compCount++;++low;}
Shift(data,data,high,low);
}
Shift(data,data,low,0);
return low;
}
void QSort(int low,int high)//QuickSort的輔助函數(shù)
{
int pivotloc;
if(low<high)
{
pivotloc=Partition(low,high);
QSort(low,pivotloc-1);
QSort(pivotloc+1,high);
}
}
void QuickSort()//快速排序
{
BeforeSort();
QSort(1,size);
output();
}
void ShellSort()//希爾排序
{
BeforeSort();
int i,j,h;
i=4;
h=1;
while(i<=size)
{
i=i*2;
h=2*h+1;
}
while (h!=0)
{
i=h;
while(i<=size)
{
j=i-h;
while(j>0&&Less(j+h,j))
{
Swap(j,j+h);
j=j-h;
}
i++;
}
h=(h-1)/2;
}
output();
}
void Sift(int left,int right)//堆排序的調堆函數(shù)
{
int i,j,finished=0;
i=left;
j=2*i;
Shift(data,data,0,left);
Shift(data,data,MAXSIZE+1,left);
while(j<=right&&!finished)
{
if(j<right&&Less(j,j+1)) j=j+1;
if(!Less(0,j)) finished=1;
else
{
Shift(data,data,i,j);
i=j;
j=2*i;
}
}
Shift(data,data,i,MAXSIZE+1);
}
void HeapSort()//堆排序
{
int left,right;
BeforeSort();
for(left=size/2;left>=1;left--) Sift(left,size);
for(right=size;right>=2;right--)
{
Swap(1,right);
Sift(1,right-1);
}
output();
}
void BInsertSort()//折半插入排序
{
BeforeSort();
int i,low,high,m,j;
for(i=2;i<=size;i++)
{
Shift(data,data,0,i);
low=1;
high=i-1;
while(low<=high)
{
m=(low+high)/2;
if(Less(0,m)) high=m-1;
else low=m+1;
}
for(j=i-1;j>=high+1;j--) Shift(data,data,j+1,j);
Shift(data,data,high+1,0);
}
output();
}
void Binsort()//2-路插入排序
{
BeforeSort();
int i,k,j;
int first,last;
first=last=1;
Shift(R1,data,1,1);
for(i=2;i<=size;i++)
{
compCount++;
if(data[i]>=R1[1])
{
compCount++;
j=last;
while(j>=1&&R1[j]>data[i])
{
Shift(R1,R1,j+1,j);
j--;
compCount++;
}
Shift(R1,data,j+1,i);
last++;
}
else
{
first--;
if(first==0) first=size;
j=first+1;
compCount++;
while(j<=size&&R1[j]<=data[i])
{
Shift(R1,R1,j-1,j);
j++;
compCount++;
}
Shift(R1,data,j-1,i);
}
}
k=1;
j=first;
while(k<=size)
{
Shift(data,R1,k,j);
k++;
j=(j+1)%(size+1);
if(j==0) j=j+1;
}
output();
}
void Merge(int low,int m,int high)
{
int i=low,j=m+1,p=1;
while(i<=m&&j<=high)
{
if(Less(i,j)) Shift(R1,data,p++,i++);
else Shift(R1,data,p++,j++);
}
while(i<=m)
Shift(R1,data,p++,i++);
while(j<=high)
Shift(R1,data,p++,j++);
for(p=1,i=low;i<=high;p++,i++)
Shift(data,R1,i,p);
}
void MSort(int low, int high)
{
int mid;
if (low<high){
mid=(low+high)/2;
MSort(low, mid);
MSort(mid+1,high);
Merge(low, mid, high);
}
}
void MergeSort()//歸并排序
{
BeforeSort();
MSort(1,size);
output();
}
void Distribute(node *a, int w)
{
int i;
for (i=0; i<10; i++) fr[i] = -1;
for (i=head; i!=-1; i=a[i].next)
{
int x = a[i].data3 / w % 10;
if (fr[x] == -1)
{
fr[x] = re[x] = i;
compCount++;
}
else
{
a[re[x]].next = i;
re[x] = i;
shiftCount++;
}
}
for (i=0; i<10; i++)
{
if (fr[i] != -1)
{
a[re[i]].next = -1;
}
}
}
void Collect(node *a)
{
int i, last;
last = -1;
for (i=0; i<10; i++)
{
if (fr[i] != -1)
{
if (last == -1)
{
head = fr[i];
last = re[i];
}
else {
a[last].next = fr[i];
last = re[i];
shiftCount++;
}
}
}
a[last].next = -1;
}
void RadixSort()//基數(shù)排序算法。
{
BeforeSort();
ofstream out_stream;
node* a;
a=new node[size];
int i,j=1;
for (i=0; i<size; i++) {
a[i].data3=data[i+1];
a[i].next = i + 1;
}
head = 0;
a[size-1].next = -1;
for (i=1; i<=max; i*=10) {
Distribute(a, i);
Collect(a);
}
cout<<"\t"<<compCount<<"\t\t"<<shiftCount<<"\n";
while (head != -1)
{
data[j++]=a[head].data3;
head = a[head].next;
}
CopyData(data,data2);
cout<<"\n";
out_stream.open("output.txt",ios::app);
out_stream<<"\t"<<compCount<<"\t\t"<<shiftCount<<"\n\n";
out_stream.close();
}
void Initialization()//系統(tǒng)初始化
{
system("cls");//清屏
cout<<"***************************************************************************\n"
<<"***************** 《內部排序算法的比較》 ********************************\n"
<<"***************************************************************************\n"
<<"************************ *主菜單* ***************************************\n"
<<"******* 1.由系統(tǒng)隨機產(chǎn)生待排序表 ****************************************\n"
<<"******* 2.手動輸入待排序表 **********************************************\n"
<<"******* 3.返回主菜單 ****************************************************\n"
<<"******* 4.退出程序 ******************************************************\n"
<<"***************************************************************************\n"
<<"請輸入要執(zhí)行的步驟:";
}
void Interpret(int cmd)//調用各個算法
{
int i,j,m;
ofstream out_stream;
out_stream.open("output.txt",ios::app);
if(out_stream.fail())
{
cout<<"Output file opening failed.\n";
exit(1);
}
switch(cmd)
{
case 1:
out_stream<<"由系統(tǒng)隨機產(chǎn)生待排序表的各個算法的比較次數(shù)和移動次數(shù)如下:\n";
out_stream<<"\tcompCount\tshiftCount\n";
out_stream.close();
cout<<"請輸入待排序表的長度:";
cin>>size;
cout<<"由系統(tǒng)隨機產(chǎn)生待排序表的各個算法的比較次數(shù)和移動次數(shù)如下:\n";
RandomizeList();
for(m=0;m<3;m++)
{
if(m==2) InverseOrder();
cout<<"\t";
for(i=1;i<=size;i++) cout<<data[i]<<" ";
cout<<"\n";
cout<<"\tcompCount\tshiftCount\n";
for(j=0;j<SORTNUM;j++)
{
RecallList();
out_stream.open("output.txt",ios::app);
if(j==0) {cout<<"Bubbl: ";out_stream<<"Bubbl: ";out_stream.close();BubbleSort();}
if(j==1) {cout<<"Tnser: ";out_stream<<"Tnser: ";out_stream.close();InsertSort();}
if(j==2) {cout<<"Selec: ";out_stream<<"Selec: ";out_stream.close();SelectSort();}
if(j==3) {cout<<"Quick: ";out_stream<<"Quick: ";out_stream.close();QuickSort();}
if(j==4) {cout<<"Shell: ";out_stream<<"Shell: ";out_stream.close();ShellSort();}
if(j==5) {cout<<"Heap : ";out_stream<<"Heap : ";out_stream.close();HeapSort();}
if(j==6) {cout<<"BInse: ";out_stream<<"BInse: ";out_stream.close();BInsertSort();}
if(j==7) {cout<<"Merge: ";out_stream<<"Merge: ";out_stream.close();MergeSort();}
if(j==8) {cout<<"Bin : ";out_stream<<"Bin : ";out_stream.close();Binsort();}
if(j==9) {cout<<"Radix: ";out_stream<<"Radix: ";out_stream.close();RadixSort();}
}}
//}
break;
case 2:
cout<<"請輸入待排序表的長度:";
cin>>size;
cout<<"請輸入"<<size<<"個數(shù)據(jù):\n";
for(i=1;i<=size;i++) cin>>data[i];
CopyData(data,data2);
out_stream<<"手動輸入待排序表的各個算法的比較次數(shù)和移動次數(shù)如下:\n";
out_stream<<"\tcompCount\tshiftCount\n";
out_stream.close();
cout<<"手動輸入待排序表的各個算法的比較次數(shù)和移動次數(shù)如下:\n";
cout<<"\tcompCount\tshiftCount\n";
for(j=0;j<SORTNUM;j++)
{
RecallList();
out_stream.open("output.txt",ios::app);
if(j==0) {cout<<"Bubbl: ";out_stream<<"Bubbl: ";out_stream.close();BubbleSort();}
if(j==1) {cout<<"Tnser: ";out_stream<<"Tnser: ";out_stream.close();InsertSort();}
if(j==2) {cout<<"Selec: ";out_stream<<"Selec: ";out_stream.close();SelectSort();}
if(j==3) {cout<<"Quick: ";out_stream<<"Quick: ";out_stream.close();QuickSort();}
if(j==4) {cout<<"Shell: ";out_stream<<"Shell: ";out_stream.close();ShellSort();}
if(j==5) {cout<<"Heap : ";out_stream<<"Heap : ";out_stream.close();HeapSort();}
if(j==6) {cout<<"BInse: ";out_stream<<"BInse: ";out_stream.close();BInsertSort();}
if(j==7) {cout<<"Merge: ";out_stream<<"Merge: ";out_stream.close();MergeSort();}
if(j==8) {cout<<"Bin : ";out_stream<<"Bin : ";out_stream.close();Binsort();}
if(j==9) {cout<<"Radix: ";out_stream<<"Radix: ";out_stream.close();RadixSort();}
}
break;
case 3:
Initialization();
break;
}
}
void main()
{
Initialization();
int cmd;
do{
cin>>cmd;
Interpret(cmd);
}while(cmd!=4);
}
以上就是本文所述的全部內容了,希望能夠對大家熟悉掌握這十種排序算法有所幫助。
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對數(shù)怎么表達
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見的關鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)


閱讀排行
本欄相關
- 04-02c語言函數(shù)調用后清空內存 c語言調用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調用函數(shù)求fibo C語言調用函數(shù)求
隨機閱讀
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10C#中split用法實例總結
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子


