3 1 1 排序 內排序

2021-09-26 19:09:45 字數 3944 閱讀 2509

穩定與非穩定:相等的數相對位置是否改變

內排序與外排序:是否用外存儲存

思路:

從第乙個元素開始構建有序的排序

後面未排序的逐一往前面有序的排序中找適當位置插入

時間複雜度:

分類:穩定、內排序

// 插入排序

void

insertion_sort

(int data,

int len)

// 比較和交換次數

int comparecount =0;

int swapcount =0;

// 排序

int i,j;

// 從第二位開始插入前面的有序陣列,下標為1

for( i=

1; i

)else

} swapcount++

; data[j+1]

= tmp;

}printf

("插入排序比較次數:%d\n"

, comparecount)

;printf

("插入排序交換次數:%d\n"

, swapcount)

;}

思路:每次從第乙個數開始,依次比較相鄰元素,順序不變,逆序交換

最大的數一定排在最後,下一次比較到它前面乙個

乙個過程都無需交換順序則break

時間複雜度:

分類:穩定、內排序

// 交換函式,c語言中需要傳入指標才能交換

void

swap

(int

*a,int

*b)

// 氣泡排序

void

bubble_sort

(int data,

int len)

swap

(&data[i]

,&data[i+1]

);// 需要傳入位址修改

swapcount++

;// 交換次數+1

done = true;}if

(!done)

k++;}

printf

("氣泡排序比較次數:%d\n"

, comparecount)

;printf

("氣泡排序交換次數:%d\n"

, swapcount)

;}

插入排序的優化版

思路:

定義減量序列d

1>d2

>..

.>dk

>..

.>dn

=1d_1>d_2>...>d_k>...>d_n=1

d1​>d2

​>..

.>dk

​>..

.>dn

​=1依次對列表中間隔為d

kd_k

dk​的子列進行插入排序

時間複雜度:

受間隔選擇的影響

分類:非穩定、內排序

// 子列的插入排序, 將d看成1就是正常的插入排序

// 輸入:起點、節點個數、間距

void

insert_sort

(int data,

int len,

int d)

// 插入排序:有序+無序

// 每個子列

int i;

for(i=d; i

=d)

data[j+d]

= data[j];}

data[j+d]

= tmp;

}}

// 希爾排序

void

shell_sort

(int data,

int len )

/* 劃分子列 */

int d;

// 間隔

for(d=len/

2; d>

0; d/=2)}}

思路:

// 交換

void

swap

(int

*a,int

*b)

// 選擇排序

void

selection_sort

(int data,

int len)

}// 把最小的插入相應位置

swapcount++

;swap

(&data[i]

,&data[minindex]);

}printf

("選擇排序的比較次數:%d\n"

, comparecount)

;printf

("選擇排序的交換次數:%d\n"

, swapcount)

;

思路:遞迴

找到乙個支點位置

把左邊排好 - 返回步驟1

把右邊排好 - 返回步驟1

時間複雜度:t=o

(nlo

g(n)

)t=o(nlog(n))

t=o(nl

og(n

))分類:不穩定

// 交換函式

void

swap

(int

*a,int

*b)

/* 分割槽 */

intpartition

(int data,

int len)

int i =0;

// 初始i在要排序列的首位置

int j = len-1;

//初始j在要排序列的末位置

while

(iswap

(&data[i]

,&data[j]);

// 逆序交換

// 從左往右i和j位置的數相比較,順序i+1,逆序交換

while

(data[i]

<=data[j]

&& i

swap

(&data[i]

,&data[j]);

// 逆序交換

}return i;

// 返回中心軸的位置=左邊長度

}

// 遞迴執行分割槽

void

quick_sort

(int data,

int len)

// 遞迴執行分割槽

int pivot =

partition

(data, len)

;// 分割槽

quick_sort

(data, pivot)

;quick_sort

(data+pivot+

1, len-pivot-1)

;}

09 排序1 排序

09 排序1 排序 25 分 給定n 個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下 include include includeusing namespace std const int cutoff 1000...

09 排序1 排序

n個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。資料2 11個不相同的整數,測試基本正確性 資料3 10 3個隨機整數 資料4 10 4個隨機整數 資料5 10 5個隨機整數 資料6 10 5個順序整數 資料7 10 5個逆序整數 資料8 10 5個基本有序的整數 資料9 10 5個隨機正...

09 排序1 排序

本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下 資料1 只有1個元素 資料2 11個不相同的整數,測試基本正確性 資料3 103個隨機整數 資料4 104個隨機整數 資料5 105個隨機整數 資料6 105個順序整數 資料7 105個逆序整數 資料8 105個基本有序的...