c++快速排序算法代码

c++快速排序算法代码,第1张

1.将i 和j分别指向待排序区域的最左侧记录和最右侧记录的位置;

2.重复下述过程,直到i=j

21右侧扫描,直到记录j的关键码小于基准记录的关键码;

22 如果i<j,则将r[j]与r[i]交换,并将i++;

23左侧扫描,直到记录i的关键码大于基准记录的关键码;

24 如果i<j,则将r[i]与r[j]交换,并将j--;

3.退出循环,说明i和j指向了基准记录所在位置,返回该位置;

void QuickSort(int r[ ], int first, int end)

{

if (first<end) { //递归结束

pivot=Partition(r, first, end); //一次划分

QuickSort(r, first, pivot-1); //递归地对左侧子序列进行快速排序

QuickSort(r, pivot+1, end); //递归地对右侧子序列进行快速排序

}

}

int Partition(int r[ ], int first, int end)

{

i=first; j=end; //初始化

while (i<j)

{

while (i<j && r[i]<= r[j]) j--; //右侧扫描

if (i<j) {

r[i]←→r[j]; //将较小记录交换到前面

i++;

}

while (i<j && r[i]<= r[j]) i++; //左侧扫描

if (i<j) {

r[j]←→r[i]; //将较大记录交换到后面

j--;

}

}

retutn i; //i为轴值记录的最终位置

}

这题你只要把每个算法的程序代码看一下,在计算下就行

冒泡排序:两个循环,从1加到N,(1+N)N/2 = 500500,最坏交换情况是每次判断都要交换,既5005003次

选择排序:也是两个循环,比较次数跟冒泡排序一样500500,但是这个只要底层循环交换,既只需10003 = 3000次赋值。

插入排序:循环次数一样500500,但是这个最坏情况是每比较一次就赋值一次,既需500500次赋值

希尔排序:时间复杂度是N^13倍,比较次数和赋值应该是1000^13次方。

归并排序和快速排序,你去查查它的时间复杂度是怎么算,O(lgNN),好像有系数,算法导论那本书上有,现在不记得是多少了。

希望能帮到你,

#include<stdioh>

#include<malloch>

#include<conioh>

typedef struct VNode

{

int info;

struct VNode next_node;

}Node;

void input(Nodehead, int number)

{

if(number!=0)

{

int i;

Node t;

t=(Node )malloc(sizeof(Node));

head->next_node=t;

scanf("%d",&i);

t->info=i;

input(t,number-1);

}

}

void output(Nodehead, int count)

{

Node t;

if(count!=0)

{

t=head->next_node;

printf("%d ",t->info);

output(t,count-1);

}

}

void select(Nodehead, int num)

{

int tem=0;

if(num!=0)

{

int min_node;

Node t;

Node r;

Node q;

t=head->next_node;

r= head->next_node;

q=head;

min_node= t->info;

for(int i=0;i<num;i++)

{

if(min_node>t->info)

{

min_node= t->info;

r=t;

tem=i;

}

t=t->next_node;

}

for(int j=0;j<tem;j++)

q=q->next_node;

q->next_node=r->next_node;

r->next_node=head->next_node;

head->next_node=r;

select(head->next_node,num-1);

}

}

int main()

{

int num;

Node head;

head=( Node )malloc(sizeof(Node));

printf("请输入序列数据的个数:");

scanf("%d",&num);

printf("请输入序列的数据:\n");

input(head,num);

printf("\n选择排序后的序列为:\n");

select(head,num);

output(head,num);

getch();}

选择排序法:

public class TSort{

public static void main(String args[]){

int a[]={12,45,2,5,26,56};

for(int i=0;i<alength-1;i++){

int t;

for(int j=i+1;j<alength;j++){

if(a[i]>a[j]){

t=a[i];a[i]=a[j];a[j]=t;

}

}

}

for(int i=0;i<alength;i++){

Systemoutprint(a[i]+" ");

}

}

}

#include<stdioh>

void main(){

int i,j,score[10],count=0,temp,sum=0;

double avg;

for(i=0;i<10;i++){ //输入10个学生的成绩,并求着10个学生的成绩总和

printf("请输入第%d个学生的成绩:",(i+1));

scanf("%d",&score[i]);

sum+=score[i];

}

avg=sum10/10; //求着这10个学生成绩的平均值

for(i=0;i<10;i++){ //统计小于平均分的学生人数

if(score[i]<avg){

count++;

}

}

for(i=0;i<10;i++){ //使用冒泡排序对这10个学生的成绩逆序排序

for(j=0;j<9-i;j++){

if(score[j]<score[j+1]){

temp=score[j];

score[j]=score[j+1];

score[j+1]=temp;

}

}

}

printf("最高成绩:%d分,平均成绩:%2f分,低于平均成绩的人数是:%d人!\n",score[0],avg,count);

}

下面是我以前写的,希望对你有帮助。

#include<iostream>

#include<cstdlib>

#include<ctime>

using namespace std;

#define N 100 //产生的数的个数

//冒泡排序

void Bubble_Sort(int R[],int n ){

char flag='0';

cout<<"是否输出所有的数字(1/0):"<<endl;

cin>>flag;

while(flag>'1'||flag<'0'){

cout<<"输入有误,请重新输入:"<<endl;

cin>>flag;

}

int i;

if(flag=='1'){

cout<<"排序前:"<<endl;

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

cout<<R[i]<<',';

cout<<endl;

}

for(i=1;i<n;i++){ //执行n-1趟

int swap=0;

for(int j=1;j<=n-i;j++){

if(R[j] > R[j+1] ){

R[0]=R[j];

R[j]=R[j+1];

R[j+1]=R[0];

swap=1;

}

}

if(swap==0) // 没有发生一次交换,说明序列有序,则跳出循环,排序结束

break;

}

if(flag=='1'){

cout<<"冒泡排序后:"<<endl;

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

cout<<R[i]<<',';

cout<<endl;

}

}

//快速排序

int Partition(int R[],int i,int j){ //已R[i]为支点进行划分,算法返回支点记录最终的位置

R[0]=R[i]; //缓存支点记录

while(i<j){ //从表的两端交替地向中间扫描

while(i<j&&R[j]>=R[0])

j--;

if(i<j){ //将比支点记录小的交换到前面

R[i]=R[j];

i++;

}

while(i<j&&R[i]<R[0])

i++;

if(i<j){ //将比支点记录大的交换到后面

R[j]=R[i];

j--;

}

}

R[i]=R[0];

return i;

}

void Quick_Sort(int R[],int s,int t){

int i;

if(s<t){

i=Partition(R,s,t); //将表一分为二

Quick_Sort(R,s,i-1); //对支点前端子表递归排序

Quick_Sort(R,i+1,t); //对支点后端子表递归排序

}

}

void Quick(int R[],int n){

char flag='0';

cout<<"是否输出所有的数字(1/0):"<<endl;

cin>>flag;

while(flag>'1'||flag<'0'){

cout<<"输入有误,请重新输入:"<<endl;

cin>>flag;

}

int i;

if(flag=='1'){

cout<<"排序前:"<<endl;

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

cout<<R[i]<<',';

cout<<endl;

}

Quick_Sort(R,1,n);

if(flag=='1'){

cout<<"快速排序后:"<<endl;

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

cout<<R[i]<<',';

cout<<endl;

}

}

int main(){

while(1){

int R[N+1],i;

cout<<"1 在完全随机的情况下对关键码进行排序"<<endl;

cout<<"2 在完全正序的情况下对关键码进行排序"<<endl;

cout<<"3 在完全逆序的情况下对关键码进行排序"<<endl;

cout<<"0 退出"<<endl;

cout<<"请选择:"<<endl;

char p;

cin>>p;

while(p-48<0||p-48>3){

cout<<"输入有误,请重新输入:"<<endl;

cin>>p;

}

if(p-48==0)

break;

if(p-48==1){

srand((unsigned)time(NULL));

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

R[i]=rand()%10000+1;

}

else if(p-48==2){

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

R[i]=i;

}

else

for(i=N;i>=1;i--)

R[N-i+1]=i;

char k;

cout<<endl;

cout<<"1 冒泡排序"<<endl;

cout<<"2 快速排序"<<endl;

cout<<"0 退出"<<endl;

cout<<"请选择排序方法:"<<endl;

cin>>k;

while(k-48<0||k-48>2){

cout<<"输入有误,请重新输入:"<<endl;

cin>>k;

}

switch(k-48){

case 0:cout<<"谢谢使用!"<<endl;exit(0);

case 1:Bubble_Sort(R,N);break;

case 2:Quick(R,N);break;

}

system("pause");system("cls");

}

return 0;

}

对于非科班生的我来说,算法似乎对我来说是个难点,查阅了一些资料,趁此来了解一下几种排序算法。

首先了解一下,什么是程序

关于排序算法通常我们所说的往往指的是内部排序算法,即数据记录在内存中进行排序。

排序算法大体可分为两种:

一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。

另一种是非比较排序,时间复杂度可以达到O(n),主要有:计数排序,基数排序,桶排序等

冒泡排序它重复地走访过要排序的元素,一次比较相邻两个元素,如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端。

选择排序类似于冒泡排序,只不过选择排序是首先在未排序的序列中找到最小值(最大值),放到序列的起始位置,然后再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾,以此类推,直到所有元素均排序完毕。

插入排序比冒泡排序和选择排序更有效率,插入排序类似于生活中抓扑克牌来。

插入排序具体算法描述,以数组[3, 2, 4, 5, 1]为例。

前面三种排序算法只有教学价值,因为效率低,很少实际使用。归并排序(Merge sort)则是一种被广泛使用的排序方法。

它的基本思想是,将两个已经排序的数组合并,要比从头开始排序所有元素来得快。因此,可以将数组拆开,分成n个只有一个元素的数组,然后不断地两两合并,直到全部排序完成。

以对数组[3, 2, 4, 5, 1] 进行从小到大排序为例,步骤如下:

有了merge函数,就可以对任意数组排序了。基本方法是将数组不断地拆成两半,直到每一半只包含零个元素或一个元素为止,然后就用merge函数,将拆成两半的数组不断合并,直到合并成一整个排序完成的数组。

快速排序(quick sort)是公认最快的排序算法之一,有着广泛的应用。

快速排序算法步骤

参考:

常用排序算法总结(一)

阮一峰-算法总结

以上就是关于c++快速排序算法代码全部的内容,包括:c++快速排序算法代码、排序算法性能比较(数据结构)C语言程序、设计一个用链表表示的直接选择排序算法,并用程序实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存