《数据结构》第10章:排序.pptVIP

  • 5
  • 0
  • 约1.3万字
  • 约 39页
  • 2023-04-07 发布于广东
  • 举报
;第10章 排 序;直接插入排序 ;[算法10.1] 直接插入排序算法 void D_InsertSort ( Elemtype R[ ], int n) { // 对记录序列R[1..n]作直接插入排序     int i; for ( i=2; i=n; ++i ) if (R[i].keyR[i-1].key) //小于时,需要R[i-1]插入有序表适当位置 { R[0] = R[i]; // 复制为监视哨 for ( j=i-1; R[0].key R[j].key; --j ) R[j+1] = R[j]; // 记录后移 R[j+1] = R[0]; // 插入到正确位置 } };例10.1 设一组关键码为{8,3,2,5,9,1,6},按递增的顺序进行排序,则基本过程如图10.1所示: ;折半插入排序 ;[算法10.2] 折半查找算法描述 void B_InsertionSort (Elemtype R[ ], int n) { // 对记录序列R[1..n]作折半插入排序 int i, low, high , mid; for ( i=2; in; ++i ) { R[0] = R[i]; // 将R[i]暂存到R[0] low = 1; high = n-1; while (low=high) { // 在R[low..high]序列中寻找折半查找插入的位置 m = (low+high)/2; // 折半 if (R[0].key R[m].key) high = mid-1; // 插入点在低半区 else low = mid+1; // 插入点在高半区 } for ( j=i-1; j=high+1; --j ) // high+1为插入位置 R[j+1] = R[j]; // 记录后移 R[high+1] = R[0]; // 插入记录 } };希尔排序(又称缩小增量排序) ;例10.2 已知排序表关键字序列为:49,38,65,97,76,13,27,49,55,04,则希尔排序的排序过程如图10.2所示。;冒泡排序 ;[算法10.4] 冒泡排序的基本算法 void Bubble_Sort(Elemtype R[ ] , int n) { int i , j , flag; for(i=1;in;i++) // 共进行n-1趟比较 { flag=0; for (j=1;jn-i;j++) // 每趟进行n-i次比较 if (R[j].keyR[j+1].key) { R[0]=R[j]; // R[0]作为交换的中间变量 R[j]=R[j+1]; R[j+1]=R[0]; flag=1; } if (flag= =0) return; // 若第一趟过后,没有发生交换,则结束循环 } } ;快速排序 ;例10.3 对关键码序列{43,60,54,17,73,3,1,55}实施一趟快速排序,其排序过程如图10.3所示。;[算法10.5] 快速排序一次划分算法的描述 int Partition (Elemtype R[ ] , int low , int high) { // 交换记录子序列R[low..high]中的记录,使枢轴记录到位,并返回其所 // 在位置,此时,在它之前(后)的记录均不大(小)于它 R[0].key= R[low].key;// 用子表的第一个记录作枢轴记录 privotkey=R[low].key; while (lowhigh) { // 从表的两端交替地向中间扫描 while (lowhigh R[high].key=pivotkey) --high; if (lowhigh) // 将比枢轴记录小的记录交换到低端 { R[low]=R[high]; low++; } while (lowhigh R[low].key=pivotkey) ++low; if (lowhigh) // 将比枢轴记录大的记录交换到高端 {R[high]=R[low]; high--; } } R[low]=R[0]; // 将比枢轴记录到位 return low; // 返回枢轴所在位置 } // Partition;[算法10.6] 快速排序的算法描述 void QSort (Elemtype R[ ], int s, int t) { // 对记录序列R[s..t]进行快速排序 if (s t) { // 长度大于1

文档评论(0)

1亿VIP精品文档

相关文档