排序與查詢演算法(C語言描述)

2021-07-30 08:17:20 字數 3279 閱讀 2512

c++自帶的algorithm庫函式中提供了排序演算法。

自帶排序演算法的一般形式為:

sort(arr+m,arr+n);//將陣列arr的下標為m的元素到下標為n-1的元素進行從小到大排序

sort(arr+m,arr+n,comp);//與sort(arr+m,arr+n)相比,這個寫法可以自己定義排序的規則,其中,comp為自定義的函式

基本思想:

選擇排序(從小到大)的基本思想是,首先,選出最小的數,放在第乙個位置;然後,選出第二小的數,放在第二個位置;以此類推,直到所有的數從小到大排序。

在實現上,我們通常是先確定第i小的數所在的位置,然後,將其與第i個數進行交換。

評價:

注意:選擇排序是一種不穩定的排序演算法,可能會打亂兩個相同數字的原有順序。

例如,序列 5 8 5 2 9, 按照從小到大排序,第一輪會將第1個數字5會和2交換,那麼原序列中2個5的相對前後順序就被破壞了,所以選擇排序是一種不穩定的排序演算法。

#include 

#include

#include

const

int maxn = 10;

int main (void)

; int i = 0;

int j = 0;

srand( (unsigned)time(null) );//rand()函式產生的是偽隨機數(產生原理是 f(種子值),也就是關於乙個固定值的固定公式;

//也就是程式執行第一次和第二次產生的隨機數是一樣的,所以我們要利用srand()進行播種;srand(unsigned seed)

for (int k = 0; k < maxn; k++)

printf("初始化陣列:");

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

printf("\n");

/*----------*/

//選擇排序原理:

//1、從第乙個數開始(a[0]),找到陣列中最小的數的位置,然後交換第乙個數和最小數

//2、從第二個數開始(a[1]),找到剩餘數中最小數的位置(對應整個陣列第二小的數),然後交換第二個數和最小數

//......

//n-1、從第n-1個數開始(a[maxn-1]))、最後一次,比較最後兩數了。

//外迴圈:對應找第乙個位置上的最小數,第二個,...,當前n-1個都找好了,最後乙個自然不用找了,

// 故邊界條件為 0 ~ maxn-1 ,共 n-1次;

//內迴圈:要完成的任務是:遍歷陣列元素找到最小值;交換該位置數和最小值所在位置數,如果是本身就不用交換;

// 起點對應第一小的數放在第乙個位置,第乙個數也要遍歷到;

// 但是我是用第乙個數最為參照進行比較的,所以起點i = j + 1,直接與下乙個數進行比較即可,一直到最後乙個數;

//交換數:採用位運算中的異或運算交換兩個不同的數;

// 原理:a^b^b = a;

/*------- -*/

for (j = 0; j < maxn - 1; j++)

}if (j != min_index)

}printf("排序後陣列:");

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

putchar('\n');

return

0;}

#include 

#include

#include

const

int size = 10;

void select_sort(int a, int maxn)

printf("\n");

//核心部分

for (int j = 0; j < maxn - 1; j++)

}if (j != min_index)

}printf("排序後陣列:");

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

putchar('\n');

}int main (void)

select_sort(a, size);//排序

return

0;}

基本思想

氣泡排序(從小到大)的基本思想是,不斷比較相鄰的兩個數,讓較大的元素不斷的往後移,經過一輪比較,就選出最大的數;經過第二輪比較就選出次大的數,以此類推。

一般實現

#include 

#include

#include

#include

const

int size = 10;

void select_sort(int a, int maxn)

printf("\n");

/*--------*/

//基本思想:第一輪,比較a[0]和a[1],如果a[0]>a[1],則交換兩數,接著比較a[1]和a[2],......最後一次為a[n-2]和a[n-1]的比較,至此,a[n-1]為最大數

// 第二輪,比較a[0]和a[1], ......最後一次為a[n-3]和a[n-2]的比較

// .......

// 第n-1輪,比較a[0]和a[1],結束排序

// 外迴圈: 0~szie-1 共 n -1 輪

// 內迴圈: 總是從0和1開始比較的,故初始值j=0開始,比較到size - 1 - i;

//

//兩輪迴圈的迴圈變數的意義不同,乙個是輪數,乙個數陣列元素下表 注意理解二者的區別和聯絡

/*--------*/

for (i = 0; i < size - 1; i++) }}

printf("排序後陣列:");

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

putchar('\n');

}int main (void)

select_sort(a, size);//排序

return

0;}

優化實現

for (i = 0

; i < size - 1; i++)

}if (issorted)

}

評價

優點:穩定;

缺點:慢,每次只能移動相鄰兩個資料。

快速排序 C語言描述

time limit 15ms memory limit 65536kb submit statistic discuss problem description 山東理工大學有很多學生,當然也有很多美女,機械實驗班的學委 外號 大王八 很想找個女朋友,但他想找個身高和自己相配的女生做女朋友,現有理...

希爾排序 C語言描述

下面用個例子來說明一下 演算法編寫 for j 0 add j 0 j 依次增量排序 p k a temp 可以看出來,希爾排序是將陣列序列分成若干個子串行,然後再將子串行進行插入排序,等到序列基本有序時,最後進行一次全體插入排序。不穩定排序 可以從上面的那個例子看出,有兩個相同的數 48,但在最終...

C語言演算法描述基礎

1.2 選擇排序演算法 1.3 插入排序演算法 1.4 快速排序演算法 2.查詢演算法 定義 演算法是一些常見問題的通用解決方法 排序演算法可以按照某種順序把一組數字排列好 排序演算法每次只把乙個數字放在合適的位置上,通過大量重複以上過過程最終把所有數字都放到合適的位置上 為了把合適的數字放到合適的...