C++ 如何以不同的方式实现此冒泡排序?
我希望实现一个冒泡排序。我编写了以下代码,在C++ 如何以不同的方式实现此冒泡排序?,c++,bubble-sort,C++,Bubble Sort,我希望实现一个冒泡排序。我编写了以下代码,在do循环中使用for循环。如何将其转换为使用两个for循环的冒泡排序 这是我的密码: do { switched = false; for (int i = 1; i < size; i++) { if (a[i] < a[i-1]) { int temp = a[i]; a[i] = a[i-1]; a[i-1] = temp;
do
循环中使用for
循环。如何将其转换为使用两个for
循环的冒泡排序
这是我的密码:
do {
switched = false;
for (int i = 1; i < size; i++) {
if (a[i] < a[i-1]) {
int temp = a[i];
a[i] = a[i-1];
a[i-1] = temp;
switched = true;
}
}
} while (switched);
do{
切换=假;
对于(int i=1;i
(这是标记的家庭作业,但这是为期末考试准备的,不是实际的家庭作业。)有点义务,但嘿,你自找的:
for(bool switched=true; switched;)
{
switched = false;
for (int i = 1; i < size; i++) {
if (a[i] < a[i-1]) {
int temp = a[i];
a[i] = a[i-1];
a[i-1] = temp;
switched = true;
}
}
}
for(bool switched=true;switched;)
{
切换=假;
对于(int i=1;i
两个for循环…您可以运行内部循环
size
次,而不是检查切换的,方法是让外部循环for(int j=0;j第一次完全通过循环(即,外部do
循环的第一次迭代)保证将最大的元素放置在a[size-1]的位置
(你知道为什么吗?)。下一个完整过程保证不会改变这一点,此外,将第二大元素放置在位置a[size-2]
(同样,你知道为什么吗?)依此类推。因此,第一个过程需要i
从1
到size-1
,但第二个过程只需要i
从1
到size-2
,第三个过程只需要i
从1
到size-3
,依此类推。总的来说,您最多需要size-1
过程(最后一次传球仅覆盖位置1
,并将a[1]
与a[0]
进行比较,以确保最小的元素就位)
因此,您的外部for
-循环需要改变max_i
,最初设置为size-1
,最后设置为1
,而内部for
-循环需要改变i
从1
到max_i
,因为您知道列表中的最后一个元素总是会被排序的(因为它一直冒泡到顶部)你可以停在那里
for(int x = size; x >= 0; x--) {
bool switched = false;
for(int i = 1; i < x; i++) {
if(blah) {
// swap code here
switched = true;
}
}
if(!switched) break; // not the biggest fan of this but it gets the job done
}
用于(int x=size;x>=0;x--){
布尔值=假;
对于(int i=1;i
想想do
循环可以执行的最大次数。由于内部循环运行的最大次数是size
次,因此您知道外部循环只能由size
绑定
for (int x = 0; x < size; x++ )
{
switched = false;
for (int i = 1; i < size; i++)
{
if (a[i] < a[i - 1])
{
int temp = a[i];
a[i] = a[i - 1];
a[i - 1] = temp;
switched = true;
}
}
if(switched)
{
break;
}
}
for(int x=0;x
使用两个for循环的愚蠢方法如下:
for(bool switched=true;switched;)
{
switched=false;
for(int i=1; i<size; ++i)
{
if (a[i] < a[i-1])
{
int temp = a[i];
a[i] = a[i-1];
a[i-1] = temp;
switched = true;
}
}
}
for(bool switched=true;switched;)
{
切换=假;
对于(int i=1;i冒泡排序的一个简单改进是记住发生交换的最后一个位置。每次传递后,对超过该点的元素进行排序。下一次循环仅迭代到上一个高水位线
void bubble_sort(int *arr, int size)
{
for (int hwm; size > 1; size = hwm)
{
hwm = 0;
for (int i = 1; i < size; ++i)
{
if (arr[i] < arr[i-1])
{
std::swap(arr[i], arr[i-1]);
hwm = i;
}
}
}
}
void bubble\u排序(int*arr,int size)
{
用于(整数hwm;大小>1;大小=hwm)
{
hwm=0;
对于(int i=1;i
“我想实现一个冒泡排序”-这是你的问题!(说真的,他们为什么继续坚持教授使用冒泡排序…)@ MikWesty,实现BuffelORT只是教学排序的入门……它帮助您理解其他排序技术。您不应该从零开始吗?@ GLoWoCuff:I认为JVM不太抱怨C++代码。@ DelMmg是的,是的,正如我刚才说的,乍一看,它似乎是一个java问题。我今天早上起得很早,去和国际客户一起工作:-(我要怪它!哇。为什么讨厌呢?:(我不想提高投票率,因为…哇,这太糟糕了!同时,我不想降低投票率,因为它很聪明,很好)正确。撕碎了!你应该被报告为对
声明的
残忍对待!@glowcoder:请不要投票。非常感谢你的评论!我在这个简短的回答和一个尖刻的评论之间被撕碎了:)如果你不喜欢中断
你可以做i@Jon以前给CS101作业评分过,是的,我同意。这可能是教授最想要的,特别是关于“最近最高元素”总是如何排序的一个小片段。@Jon是的。我更喜欢break
。这样做会让在循环之外是可变的,因此在一个比它需要的范围更大的范围内。函数往往会变得足够大,我们不应该给人们比他们需要的更多的变量。我也是break
的粉丝。如果你不介意最好的情况==最坏的情况,那么break
是完全可选的。也不会x>1
是否为第一个循环工作?
void bubble_sort(int *arr, int size)
{
for (int hwm; size > 1; size = hwm)
{
hwm = 0;
for (int i = 1; i < size; ++i)
{
if (arr[i] < arr[i-1])
{
std::swap(arr[i], arr[i-1]);
hwm = i;
}
}
}
}