希尔排序算法分析及程序示例 | 冒泡排序算法分析及程序示例
2011年09月01日
实例说明:
用快速排序的方法对数组进行排序。
实例解析:
快速排序 (QuickSort)
快速排序是一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
(1)分治法的基本思想,将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
(2)快速排序的基本思想
设当前待排序的无序区为 R[low..high], 利用分治法的基本思想如下:
① 分解。在 R[low..high] 中任选一个记录作为基准(pivot),以此基准将当前无序区划分为左、右两个较小的子区间 R[low..pivotpos-1] 和 R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为 pivot)的关键字 pivot.key,右边的子区间中所有记录的关键字均大于等于 pivot.key,而基准记录 pivot 则位于正确的位置(pivotpos)上,无需参加后续的排序。
划分的关键是要求出基准记录所在的位置 pivotpos。划分的结果可以简单地表示为(注意 pivot=R[pivotpos]):R[low..pivotpos-1].keys=pivot.key) //pivot 相当于在位置 i 上
j--; // 从右向左扫描,查找第 1 个关键字小于 pivot.key 的记录 R[j]
if(ipivot.key
R[j--]=R[i]; // 相当于交换 R[i] 和 R[j], 交换后 j 指针减 1
}//endwhile
R[i]=pivot; // 基准记录已被最后定位
return i;
}//Partition
程序代码―快速排序
#include
#define MAX 255
int R[MAX];
int Partition(int i,int j){
/*调用 Partition(R,low,high)时,对R[low..high]做划分,并返回基准记录的位置*/
int pivot=R[i]; /* 用区间的第 1 条记录作为基准 */
while(i=pivot) /*pivot 相当于在位置 i 上 */
j--; /* 从右向左扫描,查找第 1 个关键字小于 pivot.key 的记录 */
if(ipivot.key*/
R[j--]=R[i]; /* 相当于交换 R[i] 和 R[j], 交换后 j 指针减 1*/
}/*endwhile*/
R[i]=pivot; /* 基准记录已被最后定位 */
return i;
}/*end of partition*/
void Quick_Sort(int low,int high){ /* 对 R[low..high] 快速排序 */
int pivotpos; /* 划分后的基准记录的位置 */
if(lowMAX){
printf("n must more than 0 and less than %d.\n",MAX);
exit(0);
}
puts("Please input the elements one by one:");
for(i=1;i
2011年09月01日
实例说明:
用快速排序的方法对数组进行排序。
实例解析:
快速排序 (QuickSort)
快速排序是一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
(1)分治法的基本思想,将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
(2)快速排序的基本思想
设当前待排序的无序区为 R[low..high], 利用分治法的基本思想如下:
① 分解。在 R[low..high] 中任选一个记录作为基准(pivot),以此基准将当前无序区划分为左、右两个较小的子区间 R[low..pivotpos-1] 和 R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为 pivot)的关键字 pivot.key,右边的子区间中所有记录的关键字均大于等于 pivot.key,而基准记录 pivot 则位于正确的位置(pivotpos)上,无需参加后续的排序。
划分的关键是要求出基准记录所在的位置 pivotpos。划分的结果可以简单地表示为(注意 pivot=R[pivotpos]):R[low..pivotpos-1].keys=pivot.key) //pivot 相当于在位置 i 上
j--; // 从右向左扫描,查找第 1 个关键字小于 pivot.key 的记录 R[j]
if(ipivot.key
R[j--]=R[i]; // 相当于交换 R[i] 和 R[j], 交换后 j 指针减 1
}//endwhile
R[i]=pivot; // 基准记录已被最后定位
return i;
}//Partition
程序代码―快速排序
#include
#define MAX 255
int R[MAX];
int Partition(int i,int j){
/*调用 Partition(R,low,high)时,对R[low..high]做划分,并返回基准记录的位置*/
int pivot=R[i]; /* 用区间的第 1 条记录作为基准 */
while(i=pivot) /*pivot 相当于在位置 i 上 */
j--; /* 从右向左扫描,查找第 1 个关键字小于 pivot.key 的记录 */
if(ipivot.key*/
R[j--]=R[i]; /* 相当于交换 R[i] 和 R[j], 交换后 j 指针减 1*/
}/*endwhile*/
R[i]=pivot; /* 基准记录已被最后定位 */
return i;
}/*end of partition*/
void Quick_Sort(int low,int high){ /* 对 R[low..high] 快速排序 */
int pivotpos; /* 划分后的基准记录的位置 */
if(lowMAX){
printf("n must more than 0 and less than %d.\n",MAX);
exit(0);
}
puts("Please input the elements one by one:");
for(i=1;i