标签:10 右边 int 左边 基准 while 算法 排序 快速
快速排序算法是分治法的一种
什么是分治法
(11条消息) 分治法的特征和步骤_我还能再写一年的博客-CSDN博客
快速排序的解法步骤
给定十个数字,2,5,1,7,10,6,9,4,3,8进行排序
第一次
一般来说,是以第一个数为基准,
2 | 5 | 1 | 7 | 10 | 6 | 9 | 4 | 3 | 8 |
->
1 |
2 |
5 | 7 | 10 | 6 | 9 | 4 | 3 | 8 |
以2为基准,分为两个,一个是比2小的,一个是比2大的,比2小的放在左边,比2大的放在右边
第二次
再将分下来的两个继续进行刚才的操作
1 |
->不需要再进行分解了
5 | 7 | 10 | 6 | 9 | 4 | 3 | 8 |
->以5为基准,将比5小的放在左边,将比5大的放在右边
4 | 3 |
5 |
7 | 10 | 6 | 9 | 8 |
第三次
左边部分
4 | 3 |
以4为基准,比4小的放在左边,比4大的放在右边
3 |
4 |
右边部分:
7 | 10 | 6 | 9 | 8 |
以7为基准,比7小的在左边,比7大的在右边
6 |
7 |
10 | 9 | 8 |
第四次
左边部分,不需要再进行上述步骤
右边部分:
10 | 9 | 8 |
以10为基准,比10小的放左边,比10大的放右边
9 | 8 |
10 |
第5次
左边部分:
9 | 8 |
以9为基准,比9小的放在左边,比9大的放在右边
8 |
9 |
右边部分:
不需要执行了
第6次
8 |
不需要执行了
代码执行:
分解
public static void Qu(int a[] , int s, int t){
if(s<t) {
int i=Hua(a,s,t);
Qu(a,s,i-1);
Qu(a,i+1,t);
}
}
排序
public static int Hua(int a[] , int s, int t) {
/**
* s为0,也就是第一个值的数组下标
* t为a.length-1,为数组的个数-1
*/
int i=s,j=t;
int tmp=a[s];//基准
while(i!=j) {
while(j>i&&a[j]>=tmp)
j--;
a[i]=a[j];
while(i<j&&a[i]<=tmp) {
i++;
a[j]=a[i]; }
}
a[i]=tmp;
return i;
}
完整代码
public static void disp(int a[],int n) {
for(int i=0;i<=n;i++) {
System.out.print(a[i]+"\t");
}
System.out.print("\n");
}
public static int Hua(int a[] , int s, int t) {
/**
* s为0,也就是第一个值的数组下标
* t为a.length-1,为数组的个数-1
*/
int i=s,j=t;
int tmp=a[s];//基准
while(i!=j) {
while(j>i&&a[j]>=tmp)
j--;
a[i]=a[j];
while(i<j&&a[i]<=tmp) {
i++;
a[j]=a[i]; }
}
a[i]=tmp;
return i;
}
public static void Qu(int a[] , int s, int t){
if(s<t) {
int i=Hua(a,s,t);
Qu(a,s,i-1);
Qu(a,i+1,t);
}
}
public static void main(String[] args) {
//快速排序
/*Scanner s= new Scanner(System.in);
int n;
n=s.nextInt();
int [] arr =new int [n];
for(int i=0;i<=n-1;i++) {
arr[i]=s.nextInt();
}*/
int n=10;
int [] arr ={2,5,1,7,10,6,9,4,3,8};
disp(arr,n-1);
Qu(arr,0,n-1);
disp(arr,n-1);
}
标签:10,右边,int,左边,基准,while,算法,排序,快速 来源: https://blog.csdn.net/weixin_49185464/article/details/120909266
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。