菜鸟提问 c语言关于快速排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了菜鸟提问 c语言关于快速排序相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
#include<stdlib.h>
void quicksort(int R[],int s,int t)

int i=s,j=t;
int temp;
if(s<t)

temp=R[s];
while(i!=j)

while(j>i && R[j]>temp)
j--;
while(i<j && R[i]<temp)
i++;
R[j]^=R[i];
R[i]^=R[j];
R[j]^=R[i];

R[i]=temp;
quicksort(R,s,i-1);
quicksort(R,i+1,t);


int main()

int i;
int a[]=5,3,2,1,9,8,7,4,5;
quicksort(a,0,sizeof(a)/sizeof(int)-1);
for(i=0;i<sizeof(a)/sizeof(int);i++)
printf("%d ",*(a+i));
system("pause");

当数组中有重复的数字时,就排不出来了,只有数组中数字都不一样时排出的结果才正确。哪位高手能帮忙修正一下。
如果能给出快速排序的非递归代码就太感谢了,我会再加分的。
由于小弟我刚接触C语言没多久,希望能解释的浅显点。十分感谢!!!!

其实,最想说明的是那段交换的代码
R[j]^=R[i];
R[i]^=R[j];
R[j]^=R[i];
一定要排除 i==j 的情况。即自己与自己交换的情况。
如:
a=9;
a^=a;/*a=0*/
a^=a;/*a=0*/
a^=a;/*a=0*/
a就不再是10了。

#include<stdio.h>
#include<stdlib.h>
void quicksort(int R[],int s,int t)

int i,j;
int temp;
if(s<t)

temp=R[s];/*选第一个数作为参照*/
/*while(i!=j)不要用这种方法判定循环结束,万一i==j-1,i++,j--后 i〉j了,!=这个条件就救不了你了*/
for(i=s+1,j=t;i<=j;i++,j--)/*不包括参照数,进行左右阵营站队*/

while(j>i && R[j]>=temp)/*R[j]>=temp不要 = 也行,加了更好,毕竟相等的无论站左站右,哪边都无所谓*/
j--;
while(i<j && R[i]<=temp)
i++;
if(i!=j)/*i千万不能等于j*/
R[j]^=R[i];
R[i]^=R[j];
R[j]^=R[i];


i--;
if(R[s]<R[i])i--;/*调整i的值,使i指向最后一个小于等于参照数的位置*/
/*将参照数 与 最后一个小于等于参照数的数进行交换,这样就真正把左右两个阵营分开了*/
R[s]=R[i];
R[i]=temp;
quicksort(R,s,i-1);
quicksort(R,i+1,t);


int main(void)

int i;
int a[]=5,3,2,1,9,8,7,4,5;
quicksort(a,0,sizeof(a)/sizeof(int)-1);
for(i=0;i<sizeof(a)/sizeof(int);i++)
printf("%d ",*(a+i));
return 0;
参考技术A R[j]^=R[i];
R[i]^=R[j];
R[j]^=R[i];
你的代码里面R[i]^,R[j]^从何而来?不理解,不好改。
快速排序作为c语言中速度最快的一种排序,肯定能处理数字相同的情况,而且快速排序肯定是用递归算法。你的问题是算法,这里有个带注释的快速排序,win-tc和Dev-c++下运行通过。
#include <stdio.h>
#include <conio.h>
#define MAX 255
int R[MAX];

int Partition(int i,int j)
/* 调用Partition(low,high)时,对R[low..high]做划分,*/
/* 并返回基准记录的位置 */
int pivot=R[i]; /* 用区间的第1个记录作为基准 */
while(i<j)
/* 从区间两端交替向中间扫描,直至i=j为止 */
while(i<j&&R[j]>=pivot) /* pivot相当于在位置i上 */
j--; /* 从右向左扫描,查找第1个关键字小于pivot.key的记录R[j] */
if(i<j) /* 表示找到的R[j]的关键字<pivot.key */
R[i++]=R[j]; /* 相当于交换R[i]和R[j],交换后i指针加1 */
while(i<j&&R[i]<=pivot) /* pivot相当于在位置j上*/
i++; /* 从左向右扫描,查找第1个关键字大于pivot.key的记录R[i] */
if(i<j) /* 表示找到了R[i],使R[i].key>pivot.key */
R[j--]=R[i]; /* 相当于交换R[i]和R[j],交换后j指针减1 */

R[i]=pivot; /* 基准记录已被最后定位*/
return i;


void Quick_Sort(int low,int high) /* 对R[low..high]快速排序 */
int pivotpos; /* 划分后的基准记录的位置 */
if(low<high)
/* 仅当区间长度大于1时才须排序 */
pivotpos=Partition(low,high); /* 对R[low..high]做划分 */
Quick_Sort(low,pivotpos-1); /* 对左区间递归排序 */
Quick_Sort(pivotpos+1,high); /* 对右区间递归排序 */



main()
int i,n;
clrscr();
puts("Please input total element number of the sequence:");
scanf("%d",&n);
if(n<=0||n>MAX)
printf("n must more than 0 and less than %d.\n",MAX);
exit(0);

puts("Please input the elements one by one:");
for(i=1;i<=n;i++)
scanf("%d",&R[i]);
puts("The sequence you input is:");
for(i=1;i<=n;i++)
printf("%4d",R[i]);
Quick_Sort(1,n);
puts("\nThe sequence after quick_sort is:");
for(i=1;i<=n;i++)
printf("%4d",R[i]);
puts("\n Press any key to quit...");
getch();
参考技术B #include<stdio.h>
#include<stdlib.h>

void swap(int &a,int &b) //交换两个数
int temp=a;
a=b;
b=temp;

void quicksort(int R[],int s,int t)

int i=s,j=t;
int temp;
if(s<t)

temp=R[s];
while(i<j) //while(i!=j)

while(j>i && R[j]>=temp) //改成等号
j--;
while(i<j && R[i]<=temp)
i++;
swap(R[i],R[j]); //交换,你是想交换吧,虽然可以通过异或交换,但难以理解.

R[s]=R[i]; //增加的,交换中间数和第一个数
R[i]=temp;
quicksort(R,s,i-1);
quicksort(R,i+1,t);


int main()

int i;
int a[]=5,3,2,1,9,8,7,4,5;
int n = sizeof(a)/sizeof(int);
quicksort(a,0,n-1);
for(i=0;i<n;i++)
printf("%d ",*(a+i));
// system("pause");
return 1;
参考技术C R[j]^=R[i];
R[i]^=R[j];
R[j]^=R[i];

就是交换R[i]和R[j]

Linux系统下tar命令,菜鸟提问

Linux系统下tar命令是如何操作,如何实现的?
本人菜鸟,有人要我对Linux系统下的一个大文件夹(里面包含了很多东西和子文件夹)进行打包。这个命令如何使用?
还有,我用tar命令打包后的文件,会被默认放在哪??比如路径是/A/B,我要打包文件夹B,打包后的文件C会被放在A下面吗?也就是/A/C??

比如现在在 /A 文件夹下 把下面的B文件夹打包成bzip2高压方式
tar cjvf C.tar.bz2 B # 默认是在当前文件夹下的
OK后会在/A文件夹下有个名为“C.tar.bz2”的tar压缩文件
tar tvf C.tar.bz2 # 列出里面的文件

会用了吧? 呵呵 再把文档粘给你 比较长 别哭哦 学习之路还很远的

TAR(1) tar TAR(1)

NAME
tar - The GNU version of the tar archiving utility

SYNOPSIS
tar <operation> [options]

Operations:
[-]A --catenate --concatenate
[-]c --create
[-]d --diff --compare
[-]r --append
[-]t --list
[-]u --update
[-]x --extract --get
--delete

Common Options:
-C, --directory DIR
-f, --file F
-j, --bzip2
-p, --preserve-permissions
-v, --verbose
-z, --gzip

All Options:
[ --atime-preserve ] [ -b, --blocking-factor N ] [ -B, --read-full-
records ] [ --backup BACKUP-TYPE ] [ --block-compress ] [ -C, --direc-
tory DIR ] [ --check-links ] [ --checkpoint ] [ -f, --file [HOSTNAME:]F
] [ -F, --info-script F --new-volume-script F ] [ --force-local ] [
--format FORMAT ] [ -g, --listed-incremental F ] [ -G, --incremental ]
[ --group GROUP ] [ -h, --dereference ] [ --help ] [ -i, --ignore-zeros
] [ --ignore-case ] [ --ignore-failed-read ] [ --index-file FILE ] [
-j, --bzip2 ] [ -k, --keep-old-files ] [ -K, --starting-file F ] [
--keep-newer-files ] [ -l, --one-file-system ] [ -L, --tape-length N ]
[ -m, --touch, --modification-time ] [ -M, --multi-volume ] [ --mode
PERMISSIONS ] [ -N, --after-date DATE, --newer DATE ] [ --newer-mtime
DATE ] [ --no-anchored ] [ --no-ignore-case ] [ --no-recursion ] [
--no-same-permissions ] [ --no-wildcards ] [ --no-wildcards-match-slash
] [ --null ] [ --numeric-owner ] [ -o, --old-archive, --portabil-
ity, --no-same-owner ] [ -O, --to-stdout ] [ --occurrence NUM ] [
--overwrite ] [ --overwrite-dir ] [ --owner USER ] [ -p, --same-permis-
sions, --preserve-permissions ] [ -P, --absolute-names ] [ --pax-option
KEYWORD-LIST ] [ --posix ] [ --preserve ] [ --acls ] [ --selinux ] [
--xattrs ] [ --no-acls ] [ --no-selinux ] [ --no-xattrs ] [ -R,
--block-number ] [ --record-size SIZE ] [ --recursion ] [ --recursive-
unlink ] [ --remove-files ] [ --rmt-command CMD ] [ --rsh-command CMD ]
[ -s, --same-order, --preserve-order ] [ -S, --sparse ] [ --same-owner
] [ --show-defaults ] [ --show-omitted-dirs ] [ --strip-components NUM-
BER, --strip-path NUMBER (1) ] [ --suffix SUFFIX ] [ -T, --files-from F
] [ --totals ] [ -U, --unlink-first ] [ --use-compress-program PROG ]
[ --utc ] [ -v, --verbose ] [ -V, --label NAME ] [ --version ] [
--volno-file F ] [ -w, --interactive, --confirmation ] [ -W, --verify ]
[ --wildcards ] [ --wildcards-match-slash ] [ --exclude PATTERN ] [ -X,
--exclude-from FILE ] [ -Z, --compress, --uncompress ] [ -z, --gzip,
--gunzip, --ungzip ] [ -[0-7][lmh] ]

(1) tar-1.14 uses --strip-path, tar-1.14.90+ uses --strip-components

DESCRIPTION
This manual page documents the GNU version of tar, an archiving program
designed to store and extract files from an archive file known as a
tarfile. A tarfile may be made on a tape drive, however, it is also
common to write a tarfile to a normal file. The first argument to tar
must be one of the options Acdrtux, followed by any optional functions.
The final arguments to tar are the names of the files or directories
which should be archived. The use of a directory name always implies
that the subdirectories below should be included in the archive.

EXAMPLES
tar -xvf foo.tar
verbosely extract foo.tar

tar -xzf foo.tar.gz
extract gzipped foo.tar.gz

tar -cjf foo.tar.bz2 bar/
create bzipped tar archive of the directory bar called
foo.tar.bz2

tar -xjf foo.tar.bz2 -C bar/
extract bzipped foo.tar.bz2 after changing directory to bar

tar -xzf foo.tar.gz blah.txt
extract the file blah.txt from foo.tar.gz

FUNCTION LETTERS
One of the following options must be used:

-A, --catenate, --concatenate
append tar files to an archive

-c, --create
create a new archive

-d, --diff, --compare
find differences between archive and file system

-r, --append
append files to the end of an archive

-t, --list
list the contents of an archive

-u, --update
only append files that are newer than the existing in archive

-x, --extract, --get
extract files from an archive

--delete
delete from the archive (not for use on mag tapes!)

COMMON OPTIONS
-C, --directory DIR
change to directory DIR

-f, --file [HOSTNAME:]F
use archive file or device F (default "-", meaning stdin/stdout)

-j, --bzip2
filter archive through bzip2, use to decompress .bz2 files

-p, --preserve-permissions
extract all protection information

-v, --verbose
verbosely list files processed

-z, --gzip, --ungzip
filter the archive through gzip

ALL OPTIONS
--atime-preserve
don't change access times on dumped files

-b, --blocking-factor N
block size of Nx512 bytes (default N=20)

-B, --read-full-blocks
reblock as we read (for reading 4.2BSD pipes)

--backup BACKUP-TYPE
backup files instead of deleting them using BACKUP-TYPE simple
or numbered

--block-compress
block the output of compression program for tapes

-C, --directory DIR
change to directory DIR

--check-links
warn if number of hard links to the file on the filesystem mis-
match the number of links recorded in the archive

--checkpoint
print directory names while reading the archive

-f, --file [HOSTNAME:]F
use archive file or device F (default "-", meaning stdin/stdout)

-F, --info-script F --new-volume-script F
run script at end of each tape (implies --multi-volume)

--force-local
archive file is local even if has a colon

--format FORMAT
selects output archive format
v7 - Unix V7
oldgnu - GNU tar <=1.12
gnu - GNU tar 1.13
ustar - POSIX.1-1988
posix - POSIX.1-2001

-g, --listed-incremental F
create/list/extract new GNU-format incremental backup

-G, --incremental
create/list/extract old GNU-format incremental backup

-h, --dereference
don't dump symlinks; dump the files they point to

--help like this manpage, but not as cool

-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)

--ignore-case
ignore case when excluding files

--ignore-failed-read
don't exit with non-zero status on unreadable files

--index-file FILE
send verbose output to FILE instead of stdout

-j, --bzip2
filter archive through bzip2, use to decompress .bz2 files

-k, --keep-old-files
keep existing files; don't overwrite them from archive

-K, --starting-file F
begin at file F in the archive

--keep-newer-files
do not overwrite files which are newer than the archive

-l, --one-file-system
stay in local file system when creating an archive

-L, --tape-length N
change tapes after writing N*1024 bytes

-m, --touch, --modification-time
don't extract file modified time

-M, --multi-volume
create/list/extract multi-volume archive

--mode PERMISSIONS
apply PERMISSIONS while adding files (see chmod(1))

-N, --after-date DATE, --newer DATE
only store files newer than DATE

--newer-mtime DATE
like --newer, but with a DATE

--no-anchored
match any subsequenceof the name's components with --exclude

--no-ignore-case
use case-sensitive matching with --exclude

--no-recursion
don't recurse into directories

--no-same-permissions
apply user's umask when extracting files instead of recorded
permissions

--no-wildcards
don't use wildcards with --exclude

--no-wildcards-match-slash
wildcards do not match slashes (/) with --exclude

--null --files-from reads null-terminated names, disable --directory

--numeric-owner
always use numbers for user/group names

-o, --old-archive, --portability
like --format=v7; -o exhibits this behavior when creating an
archive (deprecated behavior)

-o, --no-same-owner
do not attempt to restore ownership when extracting; -o exhibits
this behavior when extracting an archive

-O, --to-stdout
extract files to standard output

--occurrence NUM
process only NUM occurrences of each named file; used with
--delete, --diff, --extract, or --list

--overwrite
overwrite existing files and directory metadata when extracting

--overwrite-dir
overwrite directory metadata when extracting

--owner USER
change owner of extraced files to USER

-p, --same-permissions, --preserve-permissions
extract all protection information

-P, --absolute-names
don't strip leading '/'s from file names

--pax-option KEYWORD-LIST
used only with POSIX.1-2001 archives to modify the way tar han-
dles extended header keywords

--posix
like --format=posix

--preserve
like --preserve-permissions --same-order

--acls this option causes tar to store each file's ACLs in the archive.

--selinux
this option causes tar to store each file's SELinux security
context information in the archive.

--xattrs
this option causes tar to store each file's extended attributes
in the archive. This option also enables --acls and--selinux if
they haven't been set already, due to the fact that the data for
those are stored in special xattrs.

--no-acls
This option causes tar not to store each file's ACLs in the
archive and not to extract any ACL information in an archive.

--no-selinux
this option causes tar not to store each file's SELinux security
context information in the archive and not to extract any
SELinux information in an archive.

--no-xattrs
this option causes tar not to store each file's extended
attributes in the archive and not to extract any extended
attributes in an archive. This option also enables --no-acls and
--no-selinux if they haven't been set already.

-R, --record-number
show record number within archive with each message

--record-size SIZE
use SIZE bytes per record when accessing archives

--recursion
recurse into directories

--recursive-unlink
remove existing directories before extracting directories of the
same name

--remove-files
remove files after adding them to the archive

--rmt-command CMD
use CMD instead of the default /usr/sbin/rmt

--rsh-command CMD
use remote CMD instead of rsh(1)

-s, --same-order, --preserve-order
list of names to extract is sorted to match archive

-S, --sparse
handle sparse files efficiently

--same-owner
create extracted files with the same ownership

--show-defaults
display the default options used by tar

--show-omitted-dirs
print directories tar skips while operating on an archive

--strip-components NUMBER, --strip-path NUMBER
strip NUMBER of leading components from file names before
extraction

(1) tar-1.14 uses --strip-path, tar-1.14.90+ uses --strip-compo-
nents

--suffix SUFFIX
use SUFFIX instead of default '~' when backing up files

-T, --files-from F
get names to extract or create from file F

--totals
print total bytes written with --create

-U, --unlink-first
remove existing files before extracting files of the same name

--use-compress-program PROG
access the archive through PROG which is generally a compression
program

--utc display file modification dates in UTC

-v, --verbose
verbosely list files processed

-V, --label NAME
create archive with volume name NAME

--version
print tar program version number

--volno-file F
keep track of which volume of a multi-volume archive its working
in FILE; used with --multi-volume

-w, --interactive, --confirmation
ask for confirmation for every action

-W, --verify
attempt to verify the archive after writing it

--wildcards
use wildcards with --exclude

--wildcards-match-slash
wildcards match slashes (/) with --exclude

--exclude PATTERN
exclude files based upon PATTERN

-X, --exclude-from FILE
exclude files listed in FILE

-Z, --compress, --uncompress
filter the archive through compress

-z, --gzip, --gunzip, --ungzip
filter the archive through gzip

--use-compress-program PROG
filter the archive through PROG (which must accept -d)

-[0-7][lmh]
specify drive and density

BUGS
The GNU folks, in general, abhor man pages, and create info documents
instead. The maintainer of tar falls into this category. Thus this
man page may not be complete, nor current, and was included in the Red
Hat CVS tree because man is a great tool :). This man page was first
taken from Debian Linux and has since been loving updated here.

REPORTING BUGS
Please report bugs via https://bugzilla.redhat.com

SEE ALSO
The full documentation for tar is maintained as a Texinfo manual. If
the info and tar programs are properly installed at your site, the com-
mand

info tar

should give you access to the complete manual.

AUTHORS
Debian Linux http://www.debian.org/
Mike Frysinger <vapier@gentoo.org>

GNU Oct 2004 TAR(1)
参考技术A 这个命令如何使用:
tar cvvf a.tar xx/
意思是把xx文件夹及其内容打包成名为a.tar的文件

打包后的文件默认放在当前目录,也就是你所在的目录
参考技术B 基本命令为:tar cvf tar包名 目录

像你的这个问题其实网上搜一下一大堆,学习linux最主要是自己动手做试验,你问的问题完全可以动手试一下,这样最能记住。
还有记得要善用man命令。
参考技术C http://baike.baidu.com/view/209679.htm

打包时可以指定路径的

以上是关于菜鸟提问 c语言关于快速排序的主要内容,如果未能解决你的问题,请参考以下文章

C语言快速排序代码

用C语言编程实现快速排序算法

C语言 快速排序

用C语言编写函数,要实现快速排序算法或者冒泡法

[C#] 用菜鸟的思维学习算法 -- 马桶排序冒泡排序和快速排序

c语言快速排序算法