#include <stdio.h>
#include <stdlib.h>
int bubble(int *a, int n)
{
int i = 0,
j = 0,
buf;
int count = 0;
for (i = 0; i < n - 1; ++i) //比较n-1轮
{
for (j = 0; j < n - 1 - i; ++j) //每轮比较n-1-i次,
{
if (a[j] > a[j + 1])
{
buf = a[j];
a[j] = a[j + 1];
a[j + 1] = buf;
// arrayPrint(a,n);
count++;
}
}
}
return count;
}
int main(int argc, char const *argv[])
{
int length;
scanf("%d", &length);
int a[length];
for (int i = 0; i < length; i++)
{
scanf("%d", &a[i]);
}
int count = bubble(a, length);
printf("%d", count);
}
借用了下面那个人的。。。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int length;
scanf("%d", &length);
int a[length];
for (int i = 0; i < length; i++)
{
scanf("%d", &a[i]);
}
int count = bubble(a, length);
printf("%d", count);
}
int bubble(int *a, int n)
{
int i = 0,
j = 0,
buf;
int count = 0;
for (i = 0; i < n - 1; ++i) //比较n-1轮
{
for (j = 0; j < n - 1 - i; ++j) //每轮比较n-1-i次,
{
if (a[j] > a[j + 1])
{
buf = a[j];
a[j] = a[j + 1];
a[j + 1] = buf;
// arrayPrint(a,n);
count++;
}
}
}
return count;
}
// void arrayPrint(int * a ,int n){
// for (int i = 0; i < n; i++)
// {
// printf("%d\t",a[i]);
// }
// printf("\n");
// }
有帮助望采纳
这不就是一个冒泡排序码?
已优化,有帮助望采纳
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int length;
scanf("%d", &length);
int a[length];
for (int i = 0; i < length; i++)
{
scanf("%d", &a[i]);
}
int count = bubble(a, length);
printf("%d", count);
}
int bubble(int *a, int n)
{
int i = 0,
j = 0,
temp;
int count = 0;
int isOrdered = 0;
int lastExchangeIndex;
int unorderedBorder = n - 1;
for (i = 0; i < n - 1; ++i) //比较n-1轮
{
isOrdered = 1;
for (j = 0; j < unorderedBorder; ++j) //每轮比较n-1-i次,
{
if (a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
//如果出现有元素交换,则表明此躺没有完成排序
isOrdered = 0;
count++;
// arrayPrint(a, n);
//记录下最后一次交换元素的位置
lastExchangeIndex = j;
}
}
unorderedBorder = lastExchangeIndex;
if (isOrdered)
{
break;
}
}
return count;
}
// void arrayPrint(int *a, int n)
// {
// for (int i = 0; i < n; i++)
// {
// printf("%d\t", a[i]);
// }
// printf("\n");
// }
再优化
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int length;
scanf("%d", &length);
int a[length];
for (int i = 0; i < length; i++)
{
scanf("%d", &a[i]);
}
int count = bubble(a, length);
printf("%d", count);
}
int bubble(int *a, int n)
{
int i = 0,
j = 0,
temp;
int count = 0;
int isOrdered = 0;
int lastExchangeIndex;
int unorderedBorder = n - 1;
for (i = 0; i < n - 1; ++i) //比较n-1轮
{
isOrdered = 1;
for (j = 0; j < unorderedBorder; ++j) //每轮比较n-1-i次,
{
if (a[j] > a[j + 1])
{
// temp = a[j];
// a[j] = a[j + 1];
// a[j + 1] = temp;
a[j + 1] ^= a[j];
a[j] ^= a[j + 1];
a[j + 1] ^= a[j];
//如果出现有元素交换,则表明此躺没有完成排序
isOrdered = 0;
count++;
// arrayPrint(a, n);
//记录下最后一次交换元素的位置
lastExchangeIndex = j;
}
// printf("%d\n", lastExchangeIndex);
// arrayPrint(a, n);
}
unorderedBorder = lastExchangeIndex;
if (isOrdered)
{
break;
}
}
return count;
}
// void arrayPrint(int *a, int n)
// {
// for (int i = 0; i < n; i++)
// {
// printf("%d\t", a[i]);
// }
// printf("\n");
// }
void Qsort(dataArray *array,int low,int high){
int pivot;
if(low<high){
pivot = Partition(array, low, high);//将dataArray[low...high]一分为二,并返回枢轴下标
Qsort(array, low, pivot-1);//递归对低子表进行排序
Qsort(array, pivot+1, high);//递归对高子表进行排序
}
}
/*
**交换顺序表dataArray中子表的记录,使枢轴记录到位,并返回其所在位置
**目标使枢轴两边的元素均不大于(小于)它
*/
int Partition(dataArray *array,int low,int high){
int pivotKey,temp;
pivotKey = array->dataArray[low];//用子表的第一个记录作为枢轴记录
while(low<high){//从两端交替向中间扫描
while(low<high && array->dataArray[high]>=array->dataArray[pivotKey]){
high--;
}
temp = array->dataArray[high];//将比枢轴小的记录交换到低端
array->dataArray[high] = array->dataArray[low];
array->dataArray[low] = temp;
while(low<high && array->dataArray[low]<=array->dataArray[pivotKey]){
low++;
}
temp = array->dataArray[high];//将比枢轴大的记录交换到高端
array->dataArray[high] = array->dataArray[low];
array->dataArray[low] = temp;
}
return low;//返回枢轴所在的位置
}
给你点核心的代码,平均时间复杂度是O(nlog2n),空间复杂度为O(log2n