排序和查找

1、冒泡排序、鸡尾酒排序、选择排序、插入排序、快速排序/********     

#include<stdio.h>

//冒泡排序

voidMaopao(int a[],int n)

{

    int i, j;

 

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

    {

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

        {

               if(a[j] > a[j + 1])

        swap(a,j,j+1);

        }

    }

}

//交换两个数

void Swap(inta[],int i,int j)

{

    int temp;

 

    temp = a[i];

    a[i] = a[j];

    a[j] = temp;

}

//鸡尾酒排序

voidCockTailSort(int a[],int n)

{

    int left = 0,right = n - 1;

    int i;

 

    while(left < right)

    {

        for(i = left; i < right; i++)

        {

    if(a[i] > a[i + 1])

        Swap(a,i,i+1);

}

          right--;

        for(i = right; i > left; i--)

        {

    if(a[i - 1] > a[i])

Swap(a,i-1,i);

}

        left++;

    }

}

//打印函数

void Print(inta[],int n)

{

    int i;

 

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

    {

printf("%d",a[i]);

    }

    printf("\n");

}

//选择排序

void ChooseSort(inta[],int n)

{

    int i, j, min;

 

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

    {

min= i;

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

{

    if(a[min] > a[j])

    {

min= j;

             }

        }

        if(min != i)

{

    Swap(a,min,i);

         }

    }

}

//插入排序

void InsertSort(inta[],int n)

{

    int i,j;

    int get;

 

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

    {

get= a[i];

j= i - 1;

        while((j >= 0) && (get <a[j]))

         {

    a[j + 1] = a[j];

    j--;

        }

        a[j + 1] = get;

    }

}

 

int main()

{

    int a[] = {7,6,8,1,0,9,11,17,13,19,20};

    int n;

 

    n = sizeof(a) / sizeof(int);

    Print(a,n);

    //CockTailSort(a,n);

    //ChooseSort(a,n);

    InsertSort(a,n);

    Print(a,n);

 

    return 0;

}

 

2、顺序查找、折半查找(二分查找):

#include<stdio.h>

 

int Search(int *str,int len, int key);

 

int main()

{

    int a[5] = {2,56,99,10,43};

    int pos;

    int find;

    int i;

 

    find = 99;

    for(i = 0; i < 5; i++)

    {

        printf("%d ",a[i]);

    }

    printf("\n");

    pos = Search(a,5,find);  

    printf("the position of %d isno.%d\n",find,pos);

 

    return 0;

}

 

int Search(int *str,int len ,int key)

{

    int i;

 

    for(i = 0; i < len; i++)

    {

        if(str[i] == key)

        {

            return i+1;

         }

    }

}

折半查找(二分查找):

#include<stdio.h>

 

int HalfSearch(int*str, int len, int find);

 

int main()

{

    int num[10] = {1,2,3,4,5,6,7,8,9,10};

    int find;

    int pos;

    int i;

 

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

    {

printf("%d",num[i]);

    }

    printf("\ninput the num you want tofind:\n");

    scanf("%d",&find);

    pos = HalfSearch(num,10,find);

    printf("the position of %d isno.%d\n",find,pos);

 

    return 0;

}

 

int HalfSearch(int*str, int len, int find)

{

    int low = 0,high = (len - 1),mid;

    int i;

   

    while(low <= high)

    {

        mid = (low + high) / 2;

        if(find > str[mid])

        {

    low = mid + 1;

        }

        else if(find < str[mid])

        {

    high = mid - 1;

        }

        else

        {

            return (mid + 1);

        }

    }

   

    return -1;

}

 

3、二叉排序树的插入、查找、删除:

#include<stdio.h>

#include<stdlib.h>

 

#define OK 1

#define ERROR 0

 

typedef struct Node{

    char data;

    struct Node *lchild;

    struct Node *rchild;

}Tree,*TreePtr;

//前序遍历创建二叉树

voidCreateTree(TreePtr *T)

{

    char a;

 

    scanf("%c",&a);

    if('#' == a)

    {

       (*T) = NULL;

        return ;

    }

    (*T) = (TreePtr)malloc(sizeof(Tree));

    (*T)->data = a;

    CreateTree(&(*T)->lchild);

    CreateTree(&(*T)->rchild);

}

//中序遍历

voidMidOrderPrint(TreePtr T)

{

    if(T == NULL)

    {

return;

    }   

    MidOrderPrint(T->lchild);

    printf("%c",T->data);

    MidOrderPrint(T->rchild);

 

    return ;

}

//后序遍历

intAfterOrderPrint(TreePtr T)

{

    if(NULL == T)

    {

returnERROR;

    }   

    AfterOrderPrint(T);

    printf("%c",T->data);

    AfterOrderPrint(T);

 

    return OK;

}

 

int main()

{

    TreePtr T;   

 

    printf("please input preorderdata:\n");

    CreateTree(&T);

  

    printf("MidOrderPrint:");

    MidOrderPrint(T);

    printf("\n");

  

    printf("AfterOrderPrint:\n");

    AfterOrderPrint(T);

    printf("\n");

   

    return 0;

}

快速排序 :

/*****************************************************

查找最小的 k 个元素

题目:输入 n 个整数,输出其中最小的 k 个。

例如输入1,2,3,4,5,6,7和8这8个数字,

则最小的4个数字为1,2,3和4。

 *****************************************************/

 

#include<stdio.h>

 

#define N 10

 

void Quick_Sort(ints[], int L, int R)

{

    int i, j, x;

 

    if(L < R)

    {

        i = L;

        j = R;

        x = s[L];

        while(i < j)

        {

            while((i < j) && (s[j]>= x))

                j--;

            if(i < j)

               s[i++] = s[j];

            while((i < j) && (s[i]< x))

                i++;

            if(i < j)

                s[j--] = s[i];

        }

        s[i] = x;

        Quick_Sort(s, L, i - 1);

        Quick_Sort(s, i + 1, R);

    }

}

 

int main()

{

    int i;

    int a[N];

    int k;

 

    printf("please input 10numbers!\n");

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

    {

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

    }

    printf("please input the numbers ofmin!\n");

    scanf("%d",&k);

    Quick_Sort(a, 0, 9);

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

    {

        printf("%d ",a[i]);

    }

    printf("\nthe least numbers is:\n");

    for(i = 0; i < k; i++)

    {

        printf("%d ",a[i]);

    }

    printf("\n");

 

    return 0;

}

模拟扑克牌的排序查找,可以使用以下步骤: 1. 定义扑克牌的数据结构,包括花色和点数两个属性。 2. 创建一副有序的扑克牌,可以按照花色和点数的顺序排列。 3. 实现排序算法,可以选择冒泡排序、插入排序、归并排序等。 4. 对创建好的扑克牌进行排序,可以按照点数或花色进行排序。 5. 实现查找算法,可以选择顺序查找、二分查找等。 6. 根据需要查找扑克牌,可以按照花色或点数进行查找。 下面是一个简单的示例代码,实现了创建一副扑克牌、按照点数排序和二分查找功能: ```python # 定义扑克牌的数据结构 class Card: def __init__(self, suit, rank): self.suit = suit self.rank = rank # 创建一副扑克牌 deck = [] suits = ['Spades', 'Hearts', 'Diamonds', 'Clubs'] ranks = ['Ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King'] for suit in suits: for rank in ranks: card = Card(suit, rank) deck.append(card) # 按照点数排序 def sort_by_rank(deck): return sorted(deck, key=lambda card: ranks.index(card.rank)) deck_sorted_by_rank = sort_by_rank(deck) # 二分查找 def binary_search(deck, rank): low = 0 high = len(deck) - 1 while low <= high: mid = (low + high) // 2 if deck[mid].rank == rank: return mid elif deck[mid].rank < rank: low = mid + 1 else: high = mid - 1 return None # 查找扑克牌 card_rank = 'Ace' index = binary_search(deck_sorted_by_rank, card_rank) if index is not None: print(f'Found {card_rank} at index {index}') else: print(f'{card_rank} not found') ``` 上述代码中,首先定义了一个 `Card` 类来表示扑克牌,包括花色和点数两个属性。然后创建了一副有序的扑克牌,按照花色和点数的顺序排列。接着实现了排序算法 `sort_by_rank`,按照点数进行排序。最后实现了二分查找算法 `binary_search`,按照点数查找扑克牌,并输出查找结果。 当然,如果需要按照花色进行排序查找,只需要稍作修改即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值