简单选择排序
算法:
Smp_Selecpass(ListType &r,int i)
{
k=i;
for(j=i+1;j<n;i++)
if (r[j].key<r[k].key)
k=j;
if (k!=i)
{ t=r[i];r[i]=r[k];r[k]=t;}
}
Smp_Sort(ListType &r)
{
for(i=1;i<n-1;i++)
Smp_Selecpass(r,i);
}
堆排序
sift(ListType &r,int k,int m)
{
i=k;j=2*i;x=r[k].key;finished=FALSE; t=r[k];
while((j<=m)&&(!finished))
{
if ((j<m)&&(r[j].key>r[j+1].key)) j++; if (x<=r[j].key)
finished:=TRUE;
else {r[i]=r[j];i=j;j=2*i;}
}
r[i]=t;
}
HeapSort(ListType &r)
{
for(i=n/2;i>0;i--) sift(r,i,n);
for(i=n;i>1;i--){
r[1]<->r[i];
sift(r,i,i-1)
}
}
归并排序
merge(ListType r,int l,int m,int n,ListType &r2) {
i=l;j=m+1;k=l-1;
while(i<=m) and(j<n) do
{
k=k+1;
if (r[i].key<=r[j].key) {r2[k]=r[i];i++;}
else {r2[i]=r[j];j++}
}
if (i<=m) r2[k+1..n]=r[i..m];
if (j<=n) r2[k+1..n]=r[j..n];
}
mergesort(ListType &r,ListType &r1,int s,int t) {
if (s==t)
r1[s]=r[s];
else
{
mergesort(r,r2,s,s+t/2);
mergesort(r,r2,s+t/2+1,t);
merge(r2,s,s+t/2,t,r1);
}
}
快速排序
int Partition (RedType R[], int low, int high) {
R[0] = R[low]; pivotkey = R[low].key; // 枢轴 while (low<high) {
while(low<high&& R[high].key>=pivotkey)
-- high; // 从右向左搜索
R[low] = R[high];
while (low<high && R[low].key<=pivotkey) ++ low; // 从左向右搜索
R[high] = R[low];
}
R[low] = R[0]; return low;
}// Partition
void QSort ( SqList &L, int low, int high ) {
//对顺序表L中的子序列r[ low…high] 作快速排序 if ( low < high) {//长度>1
pivot = Partition ( L, low, high );
//一趟快排,将r[ ]一分为二
QSort ( L, low, pivot-1);
//在左子区间进行递归快排,直到长度为1
QSort ( L, pivot+1, high );
//在右子区间进行递归快排,直到长度为1
}
}
冒泡排序
void bubble_sort(SqList *L)
{ int m,i,j,flag=1;
RecordType x;
m=n-1;
while((m>0)&&(flag==1))
{flag=0;
for(j=1;j<=m;j++)
if(L->r[j].key>L->r[j+1].key)
{ flag=1;
x=L->r[j];
L->r[j]=L->r[j+1];
L->r[j+1]=x;
}
m--;
}
}
直接插入排序
void InsertionSort ( SqList &L ) {
// 对顺序表 L 作直接插入排序。 for ( i=2; i<=L.length; ++i )
if (L.r[i].key < L.r[i-1].key) {
L.r[0] = L.r[i]; // 复制为监视哨 for ( j=i-1; L.r[0].key < L.r[j].key; -- j ) L.r[j+1] = L.r[j]; // 记录后移 L.r[j+1] = L.r[0]; // 插入到正确位置 }
}
/*测试数据:生成exe文件后,直接把测试数据粘贴到dos窗口上即可!105 7 1 6 8 4 0 9 3 211 87 65 32 45 78 20 36 28 945 7 1 6 8 4 0 9 3 211 87 65 32 45 78 20 36 28 9411 87 65 32 45 78 20 36 28 94105 7 1 6 8 4 0 9 3 211 87 65 32 45 78 20 36 28 9436*/#include<iostream>#define MAXSIZE 20 //顺序表长度#define LT(a, b) (a < b)#define EQ(a, b) (a == b)#define LQ(a, b) (a <= b) using namespace std;typedef int KeyType; //本章中关键字都为整数类型typedef char* InfoType; typedef struct {KeyType key;InfoType otherinfo;}RedType; //记录类型typedef struct {RedType r[MAXSIZE+1]; //0号单元用作哨兵int length;}SqList; //顺序表类型//*******************************************//直接插入排序 void InsertSort ( SqList &L ) {//按非递减顺序对表进行排序,从后向前顺序比较 int i,j;for ( i = 2; i <= L.length; ++ i) if LT(L.r[i].key,L.r[i-1].key){L.r[0]=L.r[i];for ( j = i-1; LT(L.r[0].key,L.r[j].key); --j )L.r[j+1]=L.r[j];L.r[j+1]=L.r[0];}//if} //***********************//折半插入排序 void BInsertSort (SqList &L){int i,j; int high,low,m;for (i=2;i<=L.length;++i){L.r[0]=L.r[i];low=1;high=i-1; //查找范围由1到i-1while(low<=high){m=(low+high)/2;if LT(L.r[0].key,L.r[m].key) high=m-1;else low=m+1;//要查找的数L.r[0].key >=L.r[m].key,这是与折半查找的区别。也是下面为什么取high+1的症结所在 }//while 折半查找for (j=i-1;j>=high+1;--j) L.r[j+1]=L.r[j];//折半查找结束后high+1位置即为插入位置L.r[high+1]=L.r[0];}//for}//BInsertSort//*********************************typedef int SortData;void Swap(SortData &a, SortData &b){SortData temp;temp=a;a=b;b=temp;}//**************************************//希尔排序void ShellSort ( SortData V[ ], int n ) {int i,j;SortData temp; int gap = n / 2; //gap是间隔 while ( gap != 0 ) { //循环,直到gap为零for ( i = gap; i < n; i++) {temp = V[i]; //直接插入排序for ( j = i; j >= gap; j = j-gap )if ( temp < V[j-gap] )V[j] = V[j-gap];else break; V[j] = temp;//如果该for执行过,直接从else里面跳出,则j 还是i;如果进过if,那么就好理解了 } gap = ( int ) ( gap / 2 );}} //ShellSort //*************************************************************** //起泡排序void BubbleSort ( SortData V[ ], int n ) {int i = 1; int exchange = 1;SortData temp; while ( i < n && exchange ){exchange = 0; //标志置为0,假定未交换for ( int j = n-1; j >= i; j-- )
if ( V[j-1] > V[j] ) { //逆序 Swap ( V[j-1], V[j] ); //交换exchange = 1; //标志置为1,有交换}i++;}} //******************************************************************//*******************************************************************//快速排序 int Partition (SqList &L,int low, int high){L.r[0]=L.r[low]; //子表的第一个记录作基准对象,作为枢轴记录 KeyType pivotkey=L.r[low].key; //基准对象关键字 while (low<high){while (low<high && L.r[high].key>=pivotkey) --high;L.r[low]=L.r[high]; //小于基准对象的移到区间的左侧while (low<high && L.r[low].key<=pivotkey) ++low;L.r[high]=L.r[low]; //大于基准对象的移到区间的右侧}L.r[low]=L.r[0];return low;}//Partitionvoid QSort ( SqList &L, int low, int high ){//在序列low?high 中递归地进行快速排序if ( low < high) { int pivotloc= Partition (L, low, high); //划分QSort ( L, low, pivotloc-1); //对左序列同样处理 QSort ( L, pivotloc+1, high); //对右序列同样处理}}//QSortvoid QuickSort (SqList &L){QSort(L,1,L.length);}//QuickSort//**************************************************//直接选择排序 void SelectSort ( SortData V[ ], int n ) {for ( int i = 0; i < n-1; i++ ) {int k = i; //选择具有最小排序码的对象for ( int j = i+1; j < n; j++)if ( V[j] < V[k] )k = j; //当前具最小排序码的对象if ( k != i ) //对换到第 i 个位置Swap ( V[i], V[k] );} }//********************************************typedef SqList HeapType;void HeapAdjust (HeapType &H, int s, int m){//设大顶堆为H.r[s..m],且H.r[s]需要调整int j;RedType rc=H.r[s];for (j=2*s;j<=m;j*=2){if(j<m && LT(H.r[j].key, H.r[j+1].key)) ++j;if(!LT(rc.key,H.r[j].key)) break;H.r[s]=H.r[j];s=j;}H.r[s]=rc;}//HeapAdjustvoid HeapSort (HeapType &H){RedType temp;int i;for (i=H.length/2;i>0;--i) //建立堆HeapAdjust (H,i,H.length);for (i=H.length;i>1;--i) { //排序//H.r[1]←→H.r[i];temp=H.r[1];H.r[1]=H.r[i];H.r[i]=temp;HeapAdjust (H,1,i-1);}}//HeapSort//*************************************************//********归并排序**************************//void merge ( SortData InitList[ ], SortData mergedList[ ], int left, int mid, int right ) {int i = left, j = mid+1, k = left; while ( i <= mid && j <= right ) //两两比较将较小的并入if ( InitList[i] <= InitList[j] ) { mergedList [k] = InitList[i]; i++; k++; }else { mergedList [k] = InitList[j]; j++; k++; }//以下两个while每次只可能执行一个。 while ( i <= mid ){ mergedList[k] =
InitList[i]; i++; k++; }//将mid前剩余的并入while ( j <= right ){ mergedList[k] = InitList[j]; j++; k++; } //将mid后剩余的并入} void MergePass ( SortData initList[ ], SortData mergedList[ ], int len,int n ) {int i = 0;while (i+2*len-1 <= n-1) {merge( initList, mergedList, i, i+len-1, i+2*len-1);i += 2 * len; //循环两两归并}//以下是在处理尾巴 if ( i+len <= n-1 )merge( initList, mergedList, i, i+len-1, n-1);else for ( int j = i; j <= n-1; j++)mergedList [j] = initList[j];} void MergeSort (SortData initList[ ], int n ) {//按对象排序码非递减的顺序对表中对象排序SortData tempList[n];int len = 1;while ( len < n ) {MergePass ( initList, tempList, len, n );len *= 2; MergePass ( tempList, initList, len, n );len *= 2;}}//*********************************************************//******二分查找的递归实现************************** int BinCheck(SortData L[], int k,int low ,int high){if(low<=high){int mid=(low+high)/2;if(L[mid]==k){return mid;}else if(k>L[mid]){return BinCheck(L,k,mid+1,high);}else{return BinCheck(L,k,low,mid-1);}}return -1;}//**********************************************************//***********************************************************int main(){int i,j;SqList L;cin>>L.length;for(i =1; i<=L.length; i++){cin>>L.r[i].key;}InsertSort(L);cout<<"直接插入排序后:";for(i =1; i<=L.length; i++){cout << L.r[i].key;}cout<<endl<<endl;//********************************for(i =1; i<=L.length; i++){cin>>L.r[i].key;}BInsertSort(L);cout<<"折半插入排序后:";for(i =1; i<=L.length; i++){cout << L.r[i].key<<" ";}cout<<endl <<endl;//*********************************SortData V[10]={5, 4, 0, 3, 7, 9, 2, 1, 8, 6};cout<<"希尔排序之前的数组:";for(i=0; i<10; i++){cout<<V[i]<<" "; }ShellSort(V,10);cout<<endl<<"希尔排序之后的数组:";for(i=0; i<10; i++){cout<<V[i]<<" "; }cout<<endl<<endl;//***************************************************for(i=0; i<10; i++){cin>>V[i];}cout<<"冒泡排序之前的数组:";for(i=0; i<10; i++){cout<<V[i]<<" "; }BubbleSort(V,10);cout<<endl<<"冒泡排序之后的数组:";for(i=0; i<10; i++){cout<<V[i]<<" "; }cout<<endl<<endl;//*****************************************for(i =1; i<=L.length; i++){cin>>L.r[i].ke
y;}QuickSort(L);cout<<"快速排序后:"; for(i =1; i<=L.length; i++){cout << L.r[i].key<<" ";}cout<<endl <<endl;//***************************************************for(i=0; i<10; i++){cin>>V[i];}cout<<"直接选择排序之前的数组:";for(i=0; i<10; i++){cout<<V[i]<<" "; }SelectSort(V,10);cout<<endl<<"直接选择排序之后的数组:";for(i=0; i<10; i++){cout<<V[i]<<" "; }cout<<endl<<endl;//***********************************************************HeapType H;cin>>H.length;for(i=1; i<=H.length; i++){cin>>H.r[i].key;}HeapSort(H);cout<<endl<<"堆排序之后的数组:";for(i=1; i<=H.length; i++){cout<<H.r[i].key<<" "; }cout<<endl<<endl;//***************************************************************for(i=0; i<10; i++){cin>>V[i];}cout<<"归并排序之前的数组:";for(i=0; i<10; i++){cout<<V[i]<<" "; }MergeSort(V,10);cout<<endl<<"归并排序之后的数组:";for(i=0; i<10; i++){cout<<V[i]<<" "; }cout<<endl<<endl;//********************************************cout<<"以下为折半查找的递归实现"<<endl;int kk;cin>>kk;cout<<BinCheck(V,kk,0,9)<<endl;system("pause");return 0;}
一插入排序InsertionSort1基本思想每次将一个待排序的数据元素插入到前面已经排好序的数列中的适当位置使数列依然有序直到待…
数据结构各种排序算法总结计算机排序与人进行排序的不同计算机程序不能象人一样通览所有的数据只能根据计算机的quot比较quot原理在…
数据结构与算法总结姓名:**学号:**班级:12计本(2)班这个学期在老师的带领下我们学习了数据结构与算法这门课程。在本次数据结构…
排序总结排序方法平均时间最坏时间辅助存储简单排序O(n2)O(n2)O(1)快速排序O(nlogn)O(n2)O(logn)堆排序…
数据结构实验课程之手工执行一下排序算法写出每一趟排序结束时的关键码状态includeltstdiohgtincludeltstdl…
数据结构课程总结孙博110401104511计本3班如何合理的组织数据、高效的处理数据是扩大计算机应用领域、提高软件效率的关键。而…
《数据结构与算法》课程学习总结报告070401301507计本(3)班张浩本学期开设的《数据结构与算法》课程已经告一段落,现就其知…
通过一学期对《数据结构与算法》的学习,大概的了解了基本的数据结构和相应的一些算法。下面总结一下自己一个学期学习的收获和心得。数据结…
排序总结排序方法平均时间最坏时间辅助存储简单排序O(n2)O(n2)O(1)快速排序O(nlogn)O(n2)O(logn)堆排序…
数据结构与算法学习心得不管学习什么,概念是基础,所有的知识框架都是建立在基础概念之上的。所以,第一遍看课本要将概念熟记于心,然后构…