C語(yǔ)言之直接插入排序算法的方法
直接 插入排序 (Straight Insertion Sort
)是一種最簡(jiǎn)單的排序方法,其基本操作是將一條記錄插入到已排好的有序表中,從而得到一個(gè)新的、記錄數(shù)量增1的有序表。.
廢話(huà)不多說(shuō)先看看代碼
#define _CRT_SECURE_NO_WARNINGS 1 //直接插入排序法 #include <stdio.h> void Compare(int arr[], int len) { int i = 0; for (i = 0; i < len-1; i++)//len減一因?yàn)橐迦氲臄?shù)是i+1 { int M = i;//記錄有序列表最后應(yīng)該元素下標(biāo) int num = arr[i + 1];//要插入的數(shù) while (M >= 0) { if (num < arr[M])//繼續(xù)比較 { arr[M + 1] = arr[M];//交換數(shù)值 M--; } else { break; } } arr[M + 1] = num; } } int main() { int arr[] = { 2,3,4,1,2,34,4,56,3,434,4 }; int len = sizeof(arr) / 4; int i = 0; Compare(arr,len); for (i = 0; i < len; i++) { printf("%d ", arr[i]); } return 0; }
一、什么是直接插入排序
就像玩撲克時(shí)相同,假設(shè)前n-1項(xiàng)是有序數(shù)列,現(xiàn)在將第n項(xiàng)插入其中,使得前n項(xiàng)有序。然后依次進(jìn)行插入,直到將整個(gè)數(shù)列全部插入,排序完成。
對(duì)于一組數(shù)據(jù)我們無(wú)法得知是否有序,但第一個(gè)元素只有一個(gè),所以是有序的,所以將第一個(gè)元素作為第一個(gè)有序數(shù)列。后面的數(shù)值依次插入其中·。
二、代碼講解
void Compare(int arr[], int len)
首先創(chuàng)建一個(gè)插入排序的函數(shù),需要傳入數(shù)組和數(shù)據(jù)個(gè)數(shù),因此創(chuàng)建int arr[],int len兩個(gè)形參。
void Compare(int arr[], int len) { int i = 0; for (i = 0; i < len-1; i++)//len減一因?yàn)橐迦氲臄?shù)是i+1 { int M = i;//記錄有序列表最后應(yīng)該元素下標(biāo) int num = arr[i + 1];//要插入的數(shù) while (M >= 0) { if (num < arr[M])//繼續(xù)比較 { arr[M + 1] = arr[M];//交換數(shù)值 M--; } else { break; } } arr[M + 1] = num; } }
因?yàn)椴迦肱判蚴怯汕耙粋€(gè)和后一個(gè)數(shù)據(jù)進(jìn)行比較的,所以比較次數(shù)為(數(shù)據(jù)個(gè)數(shù)-1)。
int M = i;//記錄有序列表最后應(yīng)該元素下標(biāo) int num = arr[i + 1];//要插入的數(shù)
這里需要前后兩個(gè)數(shù)據(jù)比較,且這兩個(gè)需要比較的數(shù)據(jù)是變化的,所以創(chuàng)建表示兩個(gè)數(shù)據(jù)的變量。
while (M >= 0) { if (num < arr[M])//繼續(xù)比較 { arr[M + 1] = arr[M];//交換數(shù)值 M--; } else { break; } } arr[M + 1] = num;
利用循環(huán)進(jìn)行比較,如果后一個(gè)數(shù)比前一個(gè)數(shù)小,就交換位置(數(shù)值)。如果后一個(gè)數(shù)比前一個(gè)數(shù)更大,break跳出循環(huán)。
當(dāng)每一次循環(huán)比較到最后一次時(shí),需要將兩個(gè)數(shù)進(jìn)行最后的交換,因?yàn)橹爸皇菍rr[M]的值賦給了arr[M+1],此時(shí)需要將arr[M+1]的值賦給arr[M]才算完成數(shù)值交換,否則會(huì)出現(xiàn)比較數(shù)據(jù)丟失和重復(fù)的問(wèn)題。此時(shí)的M--了的,所以需要M+1得到所需要的數(shù)據(jù)下標(biāo)進(jìn)行交換。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
探討:程序在內(nèi)存中的分配(常量,局部變量,全局變量,程序代碼)問(wèn)題
本篇文章是對(duì)程序在的內(nèi)存中分配(常量,局部變量,全局變量,程序代碼)的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言聯(lián)合體類(lèi)型的實(shí)現(xiàn)
聯(lián)合體也是一種構(gòu)造數(shù)據(jù)類(lèi)型,和結(jié)構(gòu)體類(lèi)型一樣,它也是由各種不同類(lèi)型的數(shù)據(jù)組成,本文主要介紹了C語(yǔ)言聯(lián)合體類(lèi)型的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02樹(shù)形結(jié)構(gòu)的3中搜索方式示例分享
樹(shù)的3中常見(jiàn)搜索方式,包括二叉樹(shù)方式(每一層只有0和1)、滿(mǎn)m叉樹(shù)(每一層都有0 到m - 1)、子集樹(shù),也稱(chēng)為全排列樹(shù),需要的朋友可以參考下2014-02-02使用C++實(shí)現(xiàn)插件模式時(shí)的避坑要點(diǎn)(推薦)
這篇文章主要介紹了使用C++實(shí)現(xiàn)插件模式時(shí)的避坑要點(diǎn),本文主要分析實(shí)踐中常見(jiàn)的、因?yàn)閷?duì)原理不清楚而搞出來(lái)的產(chǎn)品里的坑,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08C語(yǔ)言實(shí)現(xiàn)查詢(xún)自動(dòng)售貨機(jī)中的商品價(jià)格【實(shí)例分享】
本文主要介紹了C語(yǔ)言實(shí)現(xiàn)查詢(xún)自動(dòng)售貨機(jī)中的商品價(jià)格的相關(guān)資料。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04C++詳解非類(lèi)型模板參數(shù)Nontype與Template及Parameters的使用
除了類(lèi)型可以作為模板參數(shù),普通值也可以作為模板函數(shù),即非類(lèi)型模板參數(shù)(Nontype Template Parameters)。下面讓我們一起了解一下2022-06-06