急需快速排序C语言原程序

急需快速排序C语言原程序,第1张

#include

<iostreamh>

int

data[9]

=

{54,38,96,23,15,72,60,45,83};virus

51cto技术博客

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&lt;stdioh&gt;

#include&lt;stringh&gt;

#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&lt;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&lt;ct;k++)

{

puts(ptstr[k]);

}

puts("\n here's the list:\n");

for(k=0;k&lt;ct;k++)

{

puts(input[k]);

}

return 0;

}

void stsrt(charstrings[],int num)

{

chartemp;

int top,seek;

for(top=0;top&lt;num-1;top++)

{

for(seek=top+1;seek&lt;num;seek++)

{

if(strcmp(strings[top],strings[seek])&gt;0)

{

temp=strings[top];

strings[top]=strings[seek];

strings[seek]=temp;

}

}

}

扩展资料:

printf函数使用注意事项

1、域宽

%d:按整型数据的实际长度输出。

如果想输出指定宽度可以指定域宽,%md--&gt;m域宽,打印出来以后,在控制台上,显示m位;

如果我们要打印的数的位数如果超过我们设定m则原样输出;

如果我们要打印的数的位数如果小于我们设定的位数,则补空白,具体如下:

如果m为正数,则左对齐(左侧补空白);

如果m为负数,则右对齐(右侧补空白)。

2、转义字符

如果想输出字符"%",则应该在“格式控制”字符串中用连续两个%表示。

如:printf("%f%%",10/3);输出结果:0333333%。

楼上的用的是C++

若单纯的用C那就是这样

#include<stdioh>

#define

print

"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语言选择法排序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9329104.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存