20160213.CCPP體系詳解(0023天)

尹成發表於2016-03-01

程式片段(01):全排列.c
內容概要:全排列密碼庫

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//01.對於字元型別的陣列進行初始化特點:
//  如果賦予的資料是字串,則可以省略掉大括號
//注:效能+最優
int main01(void)
{
    char arr[10] = "11111";
    for (char * p = arr; 0 != *p; ++p)
    {
        putchar(*p);
    }

    system("pause");
}

//02.凡是涉及到跨函式修改資料:
//  注:必須傳遞變數的所屬地址!
void swop(char * pa, char * pb)
{
    char temp = *pa;
    *pa = *pb;
    *pb = temp;
}

//03.全域性變數的使用:
//  導致:每次操作的都是同一個變數!
int ipos = 0;
char srcStr[5] = "1234";
void allArange(char * pBegin)
{
    if ('\0' == *pBegin)
    {
        printf("第%2d次排列,排列結果為%4s! \n", ++ipos, srcStr);
        char resPath[100] = { 0 };
        sprintf(resPath, "echo %s >> E:\\Resource\\TestData\\Test\\allArange.txt", srcStr);
        system(resPath);                                        
    }
    for (char * p = pBegin; '\0' != *p; ++p)
    {
        swop(pBegin, p);
        allArange(pBegin + 1);
        swop(p, pBegin);
    }
}

int main(void)
{
    allArange(srcStr);

    system("pause");
}

程式片段(02):快速排序法
內容概要:快速排序法

#include <stdio.h>
#include <stdlib.h>

void swop(int * pa, int * pb)
{
    int temp = *pa;
    *pa = *pb;
    *pb = temp;
}

void show(int * arr, int n)
{
    for (int i = 0; i < n; ++i)
    {
        printf("%3d", arr[i]);
    }
    printf("\n");
}

//01.快速排序:
//  用途:單執行緒整體資料排序最快!
void quick(int * arr, int leftIndex, int rightIndex)
{
    int i = leftIndex;
    int j = rightIndex + 1;
    if (i < j)//保證索引正確!+排除第一次異常!
    {
        do
        {
            do
            {
                ++i;//跳過待中立的陣列元素
            } while (i <= rightIndex && arr[i] <= arr[leftIndex]);//找到從左邊開始的第一個小於或等於陣列首元素的的陣列元素
            do
            {
                --j;//進入到真實的陣列元素
            } while (j > leftIndex && arr[j] >= arr[leftIndex]);//找到從右邊開始的第一個大於或等於首元素的陣列元素
            if (i < j)
            {
                swop(&arr[i], &arr[j]);//交換(最靠左邊的第一個小於值和最靠右邊的第一個的大於值)!
            }
        } while (i < j);//一輪交換完畢!
        swop(&arr[leftIndex], &arr[j]);
        quick(arr, leftIndex, j - 1);
        quick(arr, j + 1, rightIndex);
    }
}

int main01(void)
{
    int arr[10] = { 10, 9, 20, 19, 13, 8, 9, 22, 0, 91 };
    printf("陣列原始狀態: \n");
    show(arr, 10);
    quick(arr, 0, 9);
    printf("陣列排序之後: \n");
    show(arr, 10);

    system("pause");
}

相關文章