#include
<iostreamh>
int
data[9]
=
{54,38,96,23,15,72,60,45,83};virus
void
quick_sort(int
data[],
int
low,
int
high){virus
51cto技术博客
int
i,
j,
pivot;virus
51cto技术博客
if
(low
<
high)virus
51cto技术博客
{virus
51cto技术博客
pivot=data[low];virus
51cto技术博客
i=low;
virus
51cto技术博客
j=high;virus
51cto技术博客
virus
51cto技术博客
while(i<j)virus
51cto技术博客
{virus
51cto技术博客
while
(i<j
&&
data[j]>=pivot)virus
51cto技术博客
j--;virus
51cto技术博客
if(i<j)virus
51cto技术博客
data[i++]=data[j];
//将比枢轴记录小的记录移到低端virus
51cto技术博客
virus
51cto技术博客
while
(i<j
&&
data[i]<=pivot)virus
51cto技术博客
i++;virus
51cto技术博客
if(i<j)
virus
51cto技术博客
data[j--]=data[i];
//将比枢轴记录大的记录移到高端virus
51cto技术博客
}virus
51cto技术博客
virus
51cto技术博客
data[i]=pivot;
//枢轴记录移到最终位置virus
51cto技术博客
virus
51cto技术博客
quick_sort(data,low,i-1);virus
51cto技术博客
quick_sort(data,i+1,high);virus
51cto技术博客
}virus
51cto技术博客
}virus
51cto技术博客
virus
51cto技术博客
void
main()virus
51cto技术博客
{virus
51cto技术博客
quick_sort(data,
0,
8);virus
51cto技术博客
}virus
51cto技术博客
virus
51cto技术博客
下面是对这段程序的分析:virus
51cto技术博客
“pivot=data[low];”表示将最低端即第一个元素作为枢轴记录,暂存到pivot中去,“while(i<j)”表示当高低指针相遇时循环终止,否则继续。“while
(i<j
&&
data[j]>=pivot)
j--;”表示从高端(即数组后面)开始搜索,直到搜索到一个比枢轴值小的某个元素,条件“data[j]>=pivot”用的是大于或等于号,可见,在搜索过程中若遇到相等的则跳过并继续搜索,条件“i<j”不可少,因为在搜索过程中,low与high可能相遇,此“i<j”跟外层while的条件“i<j”无关,作用各不相同,外层while的条件“i<j”是判断在进行从高端向低端搜索一趟、从低端向高端搜索一趟之后高低指针是否相遇,而前者却是在单向的搜索过程中为防止高低指针相遇。virus
51cto技术博客
当经过“while
(i<j
&&
data[j]>=pivot)
j--;”的搜索之后,搜索到一个比枢轴小的元素,因为在搜索完之后i、j可能相等,若相等,就没有交换的必要,因此紧接下面设置了一个判断“if(i<j)”,若成立,那么就要将比枢轴记录小的记录移到低端“data[i++]=data[j];”,这里的“data[i++]”表示先使用了data[i]之后才加1,相当于“data[i]=data[j];
i++;”两句的效果。为什么要i++?是因为刚交换的记录肯定比枢轴小,那么紧接下面的语句“while
(i<j
&&
data[i]<=pivot)”就少了一次不必要的比较(因为:data[i]<=pivot必定成立,而i<j在前面的if语句中已成立,则“i<j
&&
data[i]<=pivot”必成立,若没有i++,while中的““i<j
&&
data[i]<=pivot””在肯定成立的情况下执行了一次),提高了效率。执行“data[i++]=data[j];”之后,高端的data[j]覆盖了data[i]的值,第一次覆盖时,覆盖的是data[low]的值,因为最开始时,“pivot=data[low];”将最低端即第一个元素作为枢轴记录暂存到pivot中去了,所以不必担心,会丢失信息,由于data[j]的值赋给了data[i],那么data[j]原来的位置j就可以看做一个空白,下一次覆盖时,就将低端的data[i]复制到这个位置。virus
51cto技术博客
紧接下来的“while
(i<j
&&
data[i]<=pivot)
i++;”是从低端向高端搜索,直到找到一个比枢轴大的元素,先进行判断“if(i<j)”,若成立,如前所述,执行“data[j--]=data[i];”就将低端的data[i]复制到上次赋值后空出的j位置。virus
51cto技术博客
如此反复,直到外层while的条件不成立,即i==j,即高低指针相遇,表示已经找到了枢轴记录pivot的最终位置i,执行“data[i]=pivot;”于是,枢轴记录移到最终位置。接下来的“quick_sort(data,low,i-1);
quick_sort(data,i+1,high);”表示,对被pivot分开的左右子序列进行递归的快速排序。virus
51cto技术博客
#
include
<stdioh>void
main
(){
int
t,a,b,c,d; printf("请输入4个数;");
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
if(a>b)
{t=a;a=b;b=t;} if(a>b)
{t=a;a=b;b=t;}}
if(a>c)
{t=a;a=c;c=t;}
if(a>d)
{t=a;a=d;d=t;}
if(b>c)
{t=b;b=c;c=t;}
if(b>d)
{t=b;b=d;d=t;}
if(c>d)
{t=c;c=d;d=t;}
printf("排序结果如下:\n");
printf("%d
%d
%d
%d
\n",a,b,c,d);
C语言即中文版的C语言,是一种面向过程的计算机程序设计语言。
#include<stdioh>
#define M 5
void main()
{
int b[M],i,j,t,k;
for(i=0;i<M;i++)
scanf("%d",&b[i]);
for(i=0;i<M-1;i++)
{
for(k=i,j=i+1;j<M;j++)
if(b[k]<b[j])
k=j;
if(i!=k)
{
t=b[i];
b[i]=b[k];
b[k]=t;
}
}
for(i=0;i<M;i++)
printf("%d ",b[i]);
}
错在大括号位置加错了。
扩展资料:
C语言选择排序详解
工作原理是每一次从无序组的数据元素中选出最小(或最大)的一个元素,存放在无序组的起始位置,无序组元素减少,有序组元素增加,直到全部待排序的数据元素排完。
以升序为例的图解:
代码:
#include<stdioh>
void SelectionSort(int num,int n)
{
int i = 0;
int min = 0;
int j = 0;
int tmp = 0;
for(i = 0;i < n-1;i++)
{
min = i;//每次讲min置成无序组起始位置元素下标
for(j = i;j < n;j++)//遍历无序组,找到最小元素。
{
if(num[min]>num[j])
{
min = j;
}
}
if(min != i)//如果最小元素不是无序组起始位置元素,则与起始元素交换位置
{
tmp = num[min];
num[min] = num[i];
num[i] = tmp;
}
}
}
(此处空一行)
int main()
{
int num[6] = {5,4,3,2,9,1};
int i = 0;
SelectionSort(num,6);//这里需要将数列元素个数传入。有心者可用sizeof在函数内求得元素个数。
for(i = 0;i < 6;i++)
{
printf("%d ",num[i]);
}
return 0;
}
#include<stdioh>
#include<stdlibh>
#include<malloch>
#define LIST_INIT_SIZE 1000
typedef struct
{
int key;
}type;/重命名/
typedef struct
{
type r;
int length;
int listsize;
}sqlist;/定义链表/
void InitList_Sq(sqlist &L) ;
void binaryinsert(sqlist &l);
void insertsort(sqlist &L);
void main()
{
int a[LIST_INIT_SIZE];
int n;
int i;
sqlist l;/定义链表/
sqlist L;/定义链表/
printf("PLEASE INPUT N\n");
scanf("%d",&n);/输入n的值/
InitList_Sq(l);/初始化链表/
InitList_Sq(L);/初始化链表/
srand(time(NULL));/随机数播种/
for(i=1;i<=n;i++)
{/链表l,L的个元素随机数赋值/
a[i]=1+(int)(rand()%(2n));
lr[i]key= a[i];
llength++;
Lr[i]key=lr[i]key;
Llength++;
}
insertsort(l);/调用简单插入排序函数函数/
binaryinsert(L);/调用第二种算法二分插入排序的函数/
printf("\nAFTER binaryinsert the number is\n");
for(i=1;i<Llength;i++)
printf(" %d",Lr[i]);
}
void insertsort(sqlist &L)
{
int i;
int j;
for(i=2;i<Llength;i++)
if(Lr[i]key<Lr[i-1]key)
{
Lr[0]=Lr[i];/复制哨兵/
Lr[i]=Lr[i-1];
for(j=i-2;Lr[0]key<Lr[j]key;j--)
Lr[j+1]=Lr[j];/记录后移/
Lr[j+1]=Lr[0];/插入记录/
}
}
void binaryinsert(sqlist &l)
{
int i;
int high;
int low;
int j;
int m;
for(i=2;i<llength;i++)
{
lr[0]=lr[i];
low=1;
high=i-1;
while(low<=high)
{
m=(low+high)/2;/折半/
if(lr[0]key<lr[m]key)
high=m-1;/插入点在低半区/
else low=m+1;/插入点在高半区/
}
for(j=i-1;j>=high+1;j--)
lr[j+1]=lr[j];/记录后移/
lr[high+1]=lr[0];/插入记录/
}
}
void InitList_Sq(sqlist &L)
{
// 构造一个空的线性表L。
Lr =(type)malloc(LIST_INIT_SIZEsizeof(type));
if (!Lr) exit(0); // 存储分配失败
Llength = 0; // 空表长度为0
Llistsize = LIST_INIT_SIZE; // 初始存储容量
} // InitList_Sq
#include<stdioh>
#include<stringh>
#define SIZE 91
#define LIM 31
#define HALT""
void stsrt(charstrings[],int num);
int main(void)
{
char input[LIM][SIZE];
charptstr[LIM];
int ct=0;
int k=0;
printf("input up to%d lines,and I will sort them\n",LIM);
printf("To stop,press the enter key at a line's start\n");
while(ct<LIM&&gets_s(input[ct],100)!=NULL&&input[ct][0]!='\0')
{
ptstr[ct]=input[ct];
ct++;
}
stsrt(ptstr,ct);
puts("\n here's the sorted list:\n");
for(k=0;k<ct;k++)
{
puts(ptstr[k]);
}
puts("\n here's the list:\n");
for(k=0;k<ct;k++)
{
puts(input[k]);
}
return 0;
}
void stsrt(charstrings[],int num)
{
chartemp;
int top,seek;
for(top=0;top<num-1;top++)
{
for(seek=top+1;seek<num;seek++)
{
if(strcmp(strings[top],strings[seek])>0)
{
temp=strings[top];
strings[top]=strings[seek];
strings[seek]=temp;
}
}
}
扩展资料:
printf函数使用注意事项
1、域宽
%d:按整型数据的实际长度输出。
如果想输出指定宽度可以指定域宽,%md-->m域宽,打印出来以后,在控制台上,显示m位;
如果我们要打印的数的位数如果超过我们设定m则原样输出;
如果我们要打印的数的位数如果小于我们设定的位数,则补空白,具体如下:
如果m为正数,则左对齐(左侧补空白);
如果m为负数,则右对齐(右侧补空白)。
2、转义字符
如果想输出字符"%",则应该在“格式控制”字符串中用连续两个%表示。
如:printf("%f%%",10/3);输出结果:0333333%。
楼上的用的是C++
若单纯的用C那就是这样
#include<stdioh>
#define
"NO%d
%d
%d
%d
%d
%32f
%32f\n",1+i,stu[i]num,stu[i]mat,stu[i]ENG,stu[i]com,stu[i]aver,stu[i]total//宏定义节约时间
struct
student
{
int
num;
int
mat;
int
ENG;
int
com;
float
aver;
float
total;
}stu[10];//定义结构体变量
void
main()
{
int
i;
void
take_turn_print(struct
student
stu1[10])
;
float
sum(int
x,int
y,int
z);//声明求和函数
for(i=0;i<10;i++)
scanf("%d%d%d%d",&stu[i]num,&stu[i]mat,&stu[i]ENG,&stu[i]com);
for(i=0;i<10;i++)
{
stu[i]total=sum(stu[i]mat,stu[i]ENG,stu[i]com);//调用求和函数
stu[i]aver=stu[i]total/3;
}
take_turn_print(stu);//调用排序
打印函数
}
void
take_turn_print(struct
student
stu1[10])
{
void
change(int
x,int
y);//声明换位函数
void
change1(float
x,float
y);//声明换位函数
int
i,j;
for(j=0;j<9;j++)//冒泡排序
为理解简单
就没用别的排序方法
哈哈
{
for(i=0;i<9-j;i++)
{
if(stu1[i]aver<stu1[i+1]aver)
{
change(&stu1[i]num,&stu1[i+1]num);//
值交换
change(&stu1[i]mat,&stu1[i+1]mat);//
值交换
change(&stu1[i]ENG,&stu1[i+1]ENG);//
值交换
change(&stu1[i]com,&stu1[i+1]com);//
值交换
change1(&stu1[i]aver,&stu1[i+1]aver);//
值交换
change1(&stu1[i]total,&stu1[i+1]total);//
值交换
}
}
}
for(i=0;i<10;i++)
printf(print);//打印
}
void
change(int
x,int
y)
{
int
i;
i=x;
x=y;
y=i;//利用指针做变量替换
}
void
change1(float
x,float
y)
{
float
i;
i=x;
x=y;
y=i;//利用指针做变量替换
}
float
sum(int
x,int
y,int
z)
{
float
i;
i=(float)(x+y+z);
return(i);
}
前几天也是帮同学做这样的题
一模一样
看来你也是WH大学的
1、冒泡排序(最常用)
冒泡排序是最简单的排序方法:原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。(注意每一轮都是从a[0]开始比较的)
以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。
2、鸡尾酒排序
鸡尾酒排序又称双向冒泡排序、鸡尾酒搅拌排序、搅拌排序、涟漪排序、来回排序或快乐小时排序, 是冒泡排序的一种变形。该算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。
原理:数组中的数字本是无规律的排放,先找到最小的数字,把他放到第一位,然后找到最大的数字放到最后一位。然后再找到第二小的数字放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。
3、选择排序
思路是设有10个元素a[1]-a[10],将a[1]与a[2]-a[10]比较,若a[1]比a[2]-a[10]都小,则不进行交换。若a[2]-a[10]中有一个以上比a[1]小,则将其中最大的一个与a[1]交换,此时a[1]就存放了10个数中最小的一个。同理,第二轮拿a[2]与a[3]-a[10]比较,a[2]存放a[2]-a[10]中最小的数,以此类推。
4、插入排序
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素
一般来说,插入排序都采用in-place在数组上实现。
具体算法描述如下:
⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2~5
以上就是关于急需快速排序C语言原程序全部的内容,包括:急需快速排序C语言原程序、C语言需要四个数从小到大排序怎么编程、C语言选择法排序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)