欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构-挖坑填数+分治法解决快速排序问题(java+c)

发布时间:2025/3/21 编程问答 30 豆豆
生活随笔 收集整理的这篇文章主要介绍了 数据结构-挖坑填数+分治法解决快速排序问题(java+c) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

    • 一、定义
      • 1.分治法
      • 2.挖坑填数
      • 3.快速排序思想
    • 二、代码实例
      • 1.Java
      • 2.c语言

看到网上有很多的讲解,决定自己整理一遍
首先上定义

一、定义

1.分治法

分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法

简单的说就是,大的问题划分成一块一块的几个小问题,把小的问题解决了合并起来就是原问题的解

有人会问,递归和分治一样吗?其实他们是有区别的,递归是自己调用自己而分治是上面说的那样,因为递归和分治经常要一起用到,所以有些人误解递归和分治是一样的

2.挖坑填数

推荐:https://blog.csdn.net/MoreWindows/article/details/6684558?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param

3.快速排序思想

快速排序(quick sort)是由冒泡排序改进而得的,他的基本思想是在待排序的n个元素中任意取一个元素(通常取第一个元素)作为基准,把该元素放入适当位置后,数据序列被此元素划分为两部分。
所有关键字比该元素关键字小的元素放置在前一部分,所有比它大的元素放置在后一部分,并把该元素排在这两部分的中间(成为元素归位),这个过程称为一趟快速排序,即一趟划分。

之后对产生的两个部分分别重复上述过程,直至每部分内只有一个元素或空为止

通俗易懂:
1.从数列中取出一个数作为基准数(第一个数)

2.将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边 或者说,将大于等于这个数的放到它的右边,小于它的数全放到它的左边

3.再对左右区间重复第二步,直到各区间只有一个数或空为止

二、代码实例

1.Java

//java代码1: public class Main{public static void sort(int array[], int left, int right) {if(left<right) {//退出递归的条件,每次遍历当左边等于右边的时候退出,即i==j,i==j的位置就是当前轮基元素的位置int i = left,j = right, base = array[left];//设定基准为base , left == 0while(i<j) {//从两边遍历到中间,直到i=j位置,这一行和if(left<right){}一样,只不过是用i替换了left,用j替换了rightwhile(i<j && array[j]>=base)//如果遍历的元素比base大就继续找,j--,找到为止,或者到i==j为止j--;array[i] = array[j];//如果找到比base小的元素,就把j位置的值赋给i,j变成了一个坑,即比基元素小的到了基元素的前面while(i<j && array[i]<=base)//从左向右找,如果遍历的元素比base小就继续找,i++i++;}array[i] = base;//第一轮完事之后,i==j将基元素的位置重新确定,讲整个序列分为两个区间sort(array,left,i-1);//遍历左区间sort(array,i+1,right);//遍历右区间}}public static void main(String args[]) {int array[] = {9,8,7,6,5,4};int left = 0;int right = array.length-1;sort(array,left,right);for(int i = 0;i<array.length;i++) {System.out.print(array[i]+" ");}}} //java代码2: public class Main{public static void sort(int array[], int left, int right) {if(left<right) {//退出递归的条件int i = left,j = right, base = array[left];//设定基准为basewhile(i<j) {//从两边遍历到中间,直到i=j位置while(i<j && array[j]>base)//从右向左找,如果遍历的元素比base大就继续找,j--j--;if(i<j){//必不可少array[i] = array[j];//如果找到比base小的元素,就把j位置的值赋给i,j变成了一个坑,即比基元素小的到了基元素的前面i++;//转换到从左向右找,不用找相等的元素了}while(i<j && array[i]<base)//从左向右找,如果遍历的元素比base小就继续找,i++i++;if(i<j){array[j] = array[i];//如果找到比base大的元素,就把i位置的值赋给j,i变成了一个坑,上一个坑j被填满了,即比基元素大的到了基元素的后面j--;//转换到从右向左找,不用找相等的元素了}}array[i] = base;//第一轮完事之后,i==j将基元素的位置重新确定,讲整个序列分为两个区间sort(array,left,i-1);//遍历左区间sort(array,i+1,right);//遍历右区间}}public static void main(String args[]) {int array[] = {9,8,7,6,5,4};int left = 0;int right = array.length-1;sort(array,left,right);for(int i = 0;i<array.length;i++) {System.out.print(array[i]+" ");}}}

运行结果:4 5 6 7 8 9

2.c语言

//c语言代码1 #include<stdio.h>void quickSort(int array[],int left, int right) {if(left<right) {int i = left,j = right, base = array[left];while(i<j && array[j]>=base)j--;array[i] = array[j];while(i<j && array[i]<=base)i++;array[j] = array[i];array[i] = base;quickSort(array,left,i-1);quickSort(array,i+1,right);} }void main() {int array[] = {9,8,7,6,5,4};int left = 0;int right = 5;quickSort(array,left,right);for(int i = 0;i<5;i++) {printf("%d ",array[i]);} } //c语言代码2 #include<stdio.h>void quickSort(int array[],int left, int right) {if(left<right) {int i = left,j = right, base = array[left];while(i<j && array[j]>=base)j--;if(i<j) {array[i] = array[j];i++;}while(i<j && array[i]<=base)i++;if(i<j) {array[j] = array[j];j--;}array[i] = base;quickSort(array,left,i-1);quickSort(array,i+1,right);} }void main() {int array[] = {9,8,7,6,5,4};int left = 0;int right = 5;quickSort(array,left,right);for(int i = 0;i<5;i++) {printf("%d ",array[i]);} }

运行结果:4 5 6 7 8 9

总结

以上是生活随笔为你收集整理的数据结构-挖坑填数+分治法解决快速排序问题(java+c)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。