C语言快速排俦序比较次数问题

你可以用冒泡排序法自己试一试

c++快速排序_c++快速排序c++快速排序_c++快速排序


c++快速排序_c++快速排序


目的:按要求从大到小或从小到大排序。

基本思路:对尚未排序的各篪元素从头到尾依次依次比较相邻的两个元素是否逆序(与欲排顺序相反),若逆序就交换这两元素,经过轮比较排序后便可把(或峯小)的元素排好,然后再用同样的方法把剩下的元素逐个进行比较,就得到了你所要的顺序。可以看出如果有 n 个元素,那么篪一共排序要进行 n-1 轮比较,第 炿i 轮要进行 j=n-i 次比较。(如:有5个元素,则要进行5-1轮比较。第3轮则要进行5-3次比较)

下面以C语言为例子给大家一驺个明确呪的表示:

#include

void main()

{int幚 a[10];

int i,j,t;

printf("输入10个整数:n");

for( i = 0; 夿i < 10; i ++ )

scanf("%d",&a[牰 i ]); //依次输入10个整数

f镬or( j = 0; j < 9; j ++ ) //进行9轮排序 即n-1次

{for( i = 0; i < 9-j; i ++) //每轮进行n-1-j 次比较,多n-1-j 次交换

i懋f( a[ i ] > a[ i + 1 踌] )

{t = a[ i ] ;

a[ i ] = a[ i + 1 ]; //小的沉底,大的上浮

a[ 饬i + 1 ] = t;

}}

p懤rintf("排序结鳝果:");

for( i = 0; i < 10; i ++ ) //依次输出排序结果

print嚟f豁("%dt",a[ i ]);

printf("n"嚟);

}我想的话(1)和(2)一个畴从小到大,一个从大到小锕,排序的次数少吧

(3)和(4)的话(4)要的次数更多吧

快速排序统计胄比较次数和记录移动次数,用c语言实现,数据自己输入。

#include紬

#define LIST_SIZE 20

typedef st鸠ruct{黐

int key;

int other_data;

}RecordType;

typedef struc腌t{

RecordType r[LIST_SIZE+1];

int瘛 length;

}RecordList;

int compare_number=0,move_n晷umber=0;

int QKPass_one(RecordType r[], int砥 low, int high)//低到高 单排

{int x=r[low].key;

move_number++;

while(low

{while(low=x)

{com魉pare_number++;

high--;

}if(low

{r[low].key=楱r[酬high].key;

move_number++;

low++雠;

}while(㤘low

{compare_number++;

low瘛++;

}if(low

{r[high].k荭ey=r[low].key;

move_number++;

high--;

}}

r[low].key=x; //界点 雠所在位置

move_number++;

return low;

}int QK酬Pass_two(RecordType r[], int low,排序 int high)//低到高 双排

{int flag=high;㤘

RecordType x=r[low];

move_number++;

while(篪low

{while( 敕( 雠lowx.key) ||

(lowx.o篪ther_镬data))

{compare_number++;

high--;

}if(low

{r[low]=r[high];

move_number++;

low++;

}while( (low

(low

{compare_number++;

low++;

}if(low

{r[high]=r[low];

move_number++;

high--;

}}

r[low]=歯x; //界点所在位置

m丒ove_numbe呪r++;

return lowc++;

}in闳t QKPass_one2(RecordType r[], int low, int high)//高到低

{int x=r[high楱].kec++y;

move_numbe快速r++;

while(l排序ow

{while(low

{compare_number+镑幚+;

low++;

}if(low

{r[high].key=r[low].key;

move_number++;

hic++gh-伬-;

}whi镑le(lowx)

{compare_number++;

high--;

}if(low

{r[low薨].key=r[怞h亜i牰gh].key;

move踌_nu菗mber++;

low++喌;

}}

r[high].k排序ey=x; //界点所在位置

move_number++;

return high;

}void QK袤Sort_1(Reco 峁rdType r羴[], int low,int high)羴//单排

{int p嗤os=0;

if(low

{=Q墀KPass_one(r,low,high);

QKSort_1(r, low, -1);

QKSort_1(r, +1, high);

}}

void QKSort_夿2(RecordType r[], int l袤ow懋,int high)/ 瞓/双鸱排

{int =0;

if(low

{=QK 砺Pass_two(r,low锕,high);

QKSort_2(r, low, -1);

QKSort_2(r, 亜+1, high);

}}

int main() 骤

{RecordList L;

int sele炿ct;

printf("单排薨扣1、坻双排扣2n");

scanf("%菗d",&select);

switch(select)

{case 1:

{print吜f("请输入要存储的个数:");

scanf("%d",&L.length);

prin歯tf闳("请输入要存储的褫值n");

for(int i墀=1;i<=L.length;i++)

{scanf("%d",&L.咮r[i].key);

}QKSort_1(L.r,1,L.length); //48 62豁 35 77 55 14 35 98

for(int i=1;i<=L.length;i++)

{printf("%dn",L.r[i].key);

if(i==L.length) printf("n");

}printf("%dn",腌compare_number嗤);

printf("%dn",move_number);

}break;

case 2:

{printf("请输入要存储的个数(记得除于2):");

scanf("%d",&L.length);

printf("请输入要存储的值n");

for(int i=1;i<=L.length;i++)

{scan绉f("%d%d",&L.r[i].key,&L.r[i].other_data);

}QKSort_2(L.r,1,L.length);

for(int i敕=1;i<=L.length;i++)

{printf("%d黐t%dn",L.r[i].key,L.r[i].other_藿data);

}printf("%dn",籀compare_number);

printf("%dn",move_紬number);

}break;

default: brea梼k;

}return 0;

}

C语言快速排序比较次数问题

快速排序是先找到一个轴值,比较时把所有比轴值小的放到轴值的左边,

比轴值大的放到右边,再在两边各自选取雠轴值再按前面排序,直到完成

(1)已经排序完成,是快的;

(2)反序,需要将小于5的转移到5的左边,大于5的转移到5的右边,每个数都要经过比较,所以是慢的

(3)快速轴值为9,需要将9右边的转移到左边 媸,比较次数介于(1),(2)之间;

(4)轴值为5,需要将左边的9转移到5的右边,3转移到5的左边;

总体比砾较次数(1)<(4)<(3)<(2)

C语言的快速 骤梼排序咮的算法是什么啊?

就是一种算法, 算法的时间复杂度为 nlgn。 是一种排序速度很快的算法, 同时也是不稳定排序算法!

你说的可能是除了冒泡法的方法吧应该是这样的 Arrac++y.S砾ort(数组名)// 把数组升序 Array.Rrse(数组名) //把数组的顺序颠倒 还望采纳

c语言怎样实现快速排序

include

int 魑arr_num绉[];

int length;

void q鸱uick_sort(int left, int r鳝ight)

{int i, 籀j, c, temp;

if(left>right)

r魑eturn;

i= 俦left;

j= right;

temp = 荭arr_num[i]

while(i != j)

{while(arr_num[j]>=temp && i

{j--;

}w驺hile(arr鸠_num[i]<=temp && i

{i++;

}if(i

{畴c = arr_num[i];偢

a丒rr_num[i] = arr_num[j];

arr_num[j] = c;

}}

//left竑为起始值(参照值)此时的I为次排序结束的值,褫与参照值交换位置

arr_num[left] = arr_num[i];

arr_num[i] = temp;

//继续递归直到排序完成

quick_s 砺ort(le锕ft, i-1);

quick_sort(i+1, right);

}int main伬()

{int 疝i;

length = 7;

arr_num[length] = {23, 7, 17, 36, 3, 61, 49}

//啻快速排序调用

quick竑_sort(0, length-1);

//输出排序后的结果

for(i=1;i<=length;i++)

pr敕intf("%d ",arr_nu殠m[i]);

getchar();get篪char();

ret饬urn 0;

}

C语言,坻快速排序算法

0和N-1表示的 峁是数组下标。每一趟排序的目的是使值比设定的key值小的数都排到数组前部分,大的都排到后部分;然后对这两部分螭用新的关键值key分别重复上一步的作;递归,直到数组有序敕锕。

其中关键偢值key=a[low]。

用题目给定的数组模拟趟排序如下:

下标 0 1 2 3 4 5 6 7 魍 8 9

值 9 16 47 喌 82 4 蜯 66 12 3 25 51

low=0 hig啻h=9俦

part_element=a[low]=9

进入for循环

进入个while

p怞art_el搒ement<51,于是high--,high=8;

part_element<25,high--,high=7;

par晷t_element>3,不满足,结束while

a[low]=a 侴[0篪]=a[high]=a[7]=3,low++,low=1;

进入第二个while

p胄art_element<16,不满足,结束while

a[high]=a[7]=a[low]=a[1]=16,high--,high=魍6

for个循环结束,峯数组如下

3 殠16 47 82 4 66 12 快速16 蜯25 51

low=1,high=6

for第二个循环同快速上,结束时数组如懤下

3 4 47 82 47 6疝6 12 1螭6 25 51

low=2,high=3

for第三个循环,个while中high--砥以后,low==high,直接break跳出for循环,此时

3 藿 4 媸47 82 47 66 12 16 25 51

lo搒w=2 瞓,high=2

结束for以后

a[high]=a[2]=part_element=9,得到

3 4 9 82 47 66 12 16 25 51

spli 侴t函数俦return high=2

quicksort函数中midd魉吜le=2;

下面两句递归,仍然是调用split函数,对数组

0-2,3-9两部分分别重复上述作

直到数组数据有序