C语言快排

Posted

tags:

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

#include<stdio.h>
int a[1000];
void main()

int i,n;
void qsort(int x,int y);
scanf("%d",&n);
for(i=0;i<=n-1;i++)
scanf("%d",&a[i]);
qsort(0,n);
for(i=0;i<=n-1;i++)
printf("%d ",a[i]);

void qsort(int x,int y)

int l,r,mid,temp;
l=x;r=y;
mid=a[l];
do

while (a[l]<=mid)
l++;
while (a[r]>=mid)
r--;
if (l<r)

temp=a[l];a[l]=a[r];a[r]=temp;l++;r--;


while (l>=r);
if (l>x)
qsort(x,l);
if (r<y)
qsort(r,x);


为什么运行的时候会卡住了

do while这里是个死循环,等等给你详解。
while (a[r]>=mid) //这里,r=y=n,a[n]不在数组内,溢出。
r--;

do

while (a[l]<=mid)
l++;
while (a[r]>=mid)
r--;
if (l<r)

temp=a[l];a[l]=a[r];a[r]=temp;l++;r--;


while (l>=r); //do,while.循环结构是先执行一次,然后判断,如果满足继续循环。所以这个是死循环。追问

那好奇怪啊,我改了 l<r 但是输不出来了

追答

要用一个if在循环里,一旦满足就中断循环。你改成l<r还是不行的。因为有可能在一开始就满足条件了。

追问

不是说不满足才退出吗?那么满足不久可以?你QQ多少?
加下

追答

503305904

参考技术A 二元弱酸一定不会水解,只能电离.

三种排序C语言(冒泡选择快排)

冒泡排序

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

    for (int j = 0; j < n - i; j++)
    
        if (a[j] > a[j + 1])
        
            int temp = a[j];
            a[j] = a[j + 1];
            a[j + 1] = t;
        
    

选择排序

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

    int t = i;
    for (int j = i + 1; j < n; j++)
    
        if (a[t] > a[j])
        
            t = j;
        
    
    if (t != i)
    
        int temp = a[i];
        a[i] = a[t];
        a[t] = temp;
    

qsort(a, k, sizeof(a[0]), cmp);

快排

整形数组排序

static int cmp(const void *a, const void *b)

    return *(int *)a - *(int *)b;

qsort(a, k, sizeof(a[0]),cmp); // a为数组,k为数组长度

字符数组排序

static int cmp(const void *a, const void *b)

    return *(char *)a - *(char *)b;

qsort(a, len, sizeof(a[0]), cmp);

字符串排序

char a[][10] = "asasd","asdsfd","sd";
static int cmp(const void *a,const void *b)

    return strcmp((char *)a, (char *)b);

qsort(a, k, sizeof(a[0]),cmp); // k = 3;

int cmp(const void *a, const void *b)

    char *x = *(char **)a;
    char *y = *(char **)b;
    return strcmp(x, y);

qsort(orderTime, orderTimeSize, sizeof(orderTime[0]), Cmp); // **orderTime作为形参传入

二维数组排序

char a[][2]=1,2,3,4,2,3,4,5;
static int cmp(const void *a, const void *b)

    int *x = *(int **)a;
    int *y = *(int **)b;
    if (x[0] == y[0])
    
        return x[1] - y[1];
    
    return x[0] - y[0];

qsort(a, k, sizeof(a[0]), cmp); // k = 4

**结构体排序 **

/* 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。*/
typedef struct data
    int num;
    int id;
data;
static int cmp(const void *a, const void *b)

    data *aa = (data *)a;
    data *bb = (data *)b;
    return aa->num - bb->num; 

int* twoSum(int* nums, int numsSize, int target, int* returnSize)
    int *p = (int *)malloc(sizeof(int) * 2);
    data *arr = (data *)malloc(sizeof(data) * numsSize);
    for (int i = 0; i < numsSize; i++)
    
        arr[i].num = nums[i];
        arr[i].id = i;
    
    qsort(arr, numsSize, sizeof(data), cmp);
    int start = 0, end = numsSize - 1;
    for (int i = 0; i < numsSize; i++)
    
        if (target == arr[start].num + arr[end].num)
        
            p[0] = arr[start].id;
            p[1] = arr[end].id;
        
        else if(arr[start].num + arr[end].num > target)
        
            end--;
        
        else
            start++;
        
    
    *returnSize = 2;
    return p;

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

8种面试经典!排序详解--选择,插入,希尔,冒泡,堆排,3种快排,快排非递归,归并,归并非递归,计数(图+C语言代码+时间复杂度)

三种排序C语言(冒泡选择快排)

C语言编程入门笔记基础学习排序算法之快速排序,轻松掌握快排!

三种排序C语言(冒泡选择快排)

三种排序C语言(冒泡选择快排)

手撕C语言标准库qsort(自我实现简化高效版C风格泛型快排)