简化这段代码package Qsort; import java.util.Stack; public class Qsort { public static void sort(int a[],int left,int right){ //非递归快排(将数组初始的首位为第一个基准值) Stack<Integer> st = new Stack<Integer>(); st.push(left); //压入初始数组下标 st.push(right); int temp; while(!st.empty()) { right=st.pop(); //取出一对数组下标 left=st.pop(); int r=right; int l=left; while(left!=right){ //排序至left=right,得到第二个基准值 while(right>left&&a[right]>=a[left]) { right--; } if(right>left&&a[right]<a[left]) { temp=a[right]; a[right]=a[left]; a[left]=temp; } while(right>left&&a[right]>=a[left]) { left++; } if(right>left&&a[right]<a[left]) { temp=a[left]; a[left]=a[right]; a[right]=temp; } if(left<r-1) { //放入数组下标 st.push(left+1); st.push(r); } if(left>l+1) { st.push(l); st.push(left-1); } } } } }package Qsort; import java.util.Stack; public class Qsort { public static void sort(int a[],int left,int right){ //非递归快排(将数组初始的首位为第一个基准值) Stack<Integer> st = new Stack<Integer>(); st.push(left); //压入初始数组下标 st.push(right); int temp; while(!st.empty()) { right=st.pop(); //取出一对数组下标 left=st.pop(); int r=right; int l=left; while(left!=right){ //排序至left=right,得到第二个基准值 while(right>left&&a[right]>=a[left]) { right--; } if(right>left&&a[right]<a[left]) { temp=a[right]; a[right]=a[left]; a[left]=temp; } while(right>left&&a[right]>=a[left]) { left++; } if(right>left&&a[right]<a[left]) { temp=a[left]; a[left]=a[right]; a[right]=temp; } if(left<r-1) { //放入数组下标 st.push(left+1); st.push(r); } if(left>l+1) { st.push(l); st.push(left-1); } } } } }
时间: 2023-06-12 07:04:16 浏览: 77
){ //从右往左找到一个比基准值小的数 while(right>left && a[right]>=a[l]) right--; //从左往右找到一个比基准值大的数 while(right>left && a[left]<=a[l]) left++; //交换这两个数 temp=a[right]; a[right]=a[left]; a[left]=temp; } //交换基准值与left指针所指的数 temp=a[l]; a[l]=a[left]; a[left]=temp; //将左边的子数组压入栈 if(left-1>l){ st.push(l); st.push(left-1); } //将右边的子数组压入栈 if(right+1<r){ st.push(right+1); st.push(r); } } } }
相关问题
写出这段代码的伪代码package Qsort; import java.util.Stack; public class Qsort { public static void sort(int a[],int left,int right){ //非递归快排(将数组初始的首位为第一个基准值) Stack<Integer> st = new Stack<Integer>(); st.push(left); //压入初始数组下标 st.push(right); int temp; while(!st.empty()) { right=st.pop(); //取出一对数组下标 left=st.pop(); int r=right; int l=left; while(left!=right){ //排序至left=right,得到第二个基准值 while(right>left&&a[right]>=a[left]) { right--; } if(right>left&&a[right]<a[left]) { temp=a[right]; a[right]=a[left]; a[left]=temp; } while(right>left&&a[right]>=a[left]) { left++; } if(right>left&&a[right]<a[left]) { temp=a[left]; a[left]=a[right]; a[right]=temp; } if(left<r-1) { //放入数组下标 st.push(left+1); st.push(r); } if(left>l+1) { st.push(l); st.push(left-1); } } } } }
伪代码如下:
1. 定义一个Qsort类
2. 在Qsort类中定义一个静态方法sort,该方法接收三个参数:一个整型数组a,以及数组a的左右两个下标left和right
3. 创建一个Stack对象st,用于保存待排序的子数组的左右下标
4. 将left和right依次压入栈中
5. 进入while循环,如果栈不为空,就取出一对左右下标
6. 定义r和l分别为右下标和左下标,将a[left]作为第一个基准值
7. 进入while循环,如果left不等于right,则进行以下步骤:
- 从右向左遍历数组,如果a[right]小于等于基准值,停止遍历
- 从左向右遍历数组,如果a[left]大于等于基准值,停止遍历
- 如果此时left仍然小于right,则交换a[left]和a[right]的值
8. 当left等于right时,得到第二个基准值a[left]
9. 如果l小于left-1,则将left-1和l压入栈中,继续排序左边的子数组
10. 如果r大于left+1,则将r和left+1压入栈中,继续排序右边的子数组
11. 重复步骤5~10,直到栈为空,排序完成
typedef struct{ int s; int e; }Game;如何用qsort排game.e
要使用`qsort`函数对`Game`结构体中的`e`进行排序,你可以按照以下步骤进行操作:
1. 定义一个比较函数`cmp_game_e`,它将接受两个`Game`结构体指针作为参数:
```c
int cmp_game_e(const void* a, const void* b) {
const Game* game1 = (const Game*)a;
const Game* game2 = (const Game*)b;
if (game1->e < game2->e) {
return -1;
} else if (game1->e > game2->e) {
return 1;
} else {
return 0;
}
}
```
这个比较函数将比较两个`Game`结构体的`e`成员,并根据其大小关系返回一个负数、正数或零,分别表示第一个元素小于、大于或等于第二个元素。
2. 创建一个`Game`数组,并填充数据:
```c
Game games[] = {
{4, 9},
{2, 5},
{7, 1},
// 其他游戏数据...
};
```
3. 使用`qsort`函数对`games`数组进行排序,指定比较函数`cmp_game_e`:
```c
size_t num_games = sizeof(games) / sizeof(Game);
qsort(games, num_games, sizeof(Game), cmp_game_e);
```
现在,`games`数组中的元素将按照`e`成员的升序进行排序。
需要注意的是,使用`qsort`函数进行排序时,一定要确保比较函数的实现正确。在这个例子中,我们根据`Game`结构体的`e`成员进行比较。如果你要按照其他成员进行排序,只需在比较函数中相应地修改比较逻辑即可。
阅读全文