C 語言插入排序算法及實(shí)例代碼
插入排序是排序算法的一種,它不改變原有的序列(數(shù)組),而是創(chuàng)建一個(gè)新的序列,在新序列上進(jìn)行操作。
這里以從小到大排序?yàn)槔M(jìn)行講解。
基本思想及舉例說明
插入排序的基本思想是,將元素逐個(gè)添加到已經(jīng)排序好的數(shù)組中去,同時(shí)要求,插入的元素必須在正確的位置,這樣原來排序好的數(shù)組是仍然有序的。
在實(shí)際使用中,通常是排序整個(gè)無序數(shù)組,所以把這個(gè)無序數(shù)組分為兩部分排序好的子數(shù)組和待插入的元素。第一輪時(shí),將第一個(gè)元素作為排序好的子數(shù)組,插入第二個(gè)元素;第二輪,將前兩個(gè)元素作為排序好的數(shù)組,插入第三個(gè)元素。以此類推,第i輪排序時(shí),在前i個(gè)元素的子數(shù)組中插入第i+1個(gè)元素。直到所有元素都加入排序好數(shù)組。
下面,以對 3 2 4 1 進(jìn)行選擇排序說明插入過程,使用j記錄元素需要插入的位置。排序目標(biāo)是使數(shù)組從小到大排列。
第1輪
[ 3 ]  [ 2  4  1 ]  (最初狀態(tài),將第1個(gè)元素分為排序好的子數(shù)組,其余為待插入元素)
[ 3 ]  [ 2  4  1 ]  (由于3>2,所以待插入位置j=1)
[ 2  3 ]  [ 4  1 ]  (將2插入到位置j)
第2輪
[ 2  3 ]  [ 4  1 ] (第1輪排序結(jié)果)
[ 2  3 ]  [ 4  1 ] (由于2<4,所以先假定j=2)
[ 2  3 ]  [ 4  1 ] (由于3<4,所以j=3)
[ 2  3  4 ]  [ 1 ] (由于4剛好在位置3,無需插入)
第3輪
[ 2  3  4 ]  [ 1 ] (第2輪排序結(jié)果)
[ 2  3  4 ]  [ 1 ] (由于1<2,所以j=1)
[1  2  3  4 ]    (將1插入位置j,待排序元素為空,排序結(jié)束)
算法總結(jié)及實(shí)現(xiàn)
選擇排序?qū)Υ笮镹的無序數(shù)組R[N]進(jìn)行排序,進(jìn)行N-1輪選擇過程。首先將第1個(gè)元素作為已經(jīng)排序好的子數(shù)組,然后將剩余的N-1個(gè)元素,逐個(gè)插入到已經(jīng)排序好子數(shù)組;。因此,在第 i輪排序時(shí),前i個(gè)元素總是有序的,將第i+1個(gè)元素插入到正確的位置。
#include<stdio.h>
#include<stdlib.h>
#define N 8
void insert_sort(int a[],int n);
//插入排序?qū)崿F(xiàn),這里按從小到大排序
void insert_sort(int a[],int n)//n為數(shù)組a的元素個(gè)數(shù)
{
 //進(jìn)行N-1輪插入過程
 for(int i=1; i<n; i++)
 {
  //首先找到元素a[i]需要插入的位置
  int j=0;
  while( (a[j]<a[i]) && (j<i))
  {
   j++;
  }
  //將元素插入到正確的位置
  if(i != j) //如果i==j,說明a[i]剛好在正確的位置
  {
   int temp = a[i];
   for(int k = i; k > j; k--)
   {
    a[k] = a[k-1];
   }
   a[j] = temp;
  }
 }
}
int main()
{
 int num[N] = {89, 38, 11, 78, 96, 44, 19, 25};
 insert_sort(num, N);
 for(int i=0; i<N; i++)
  printf("%d ", num[i]);
 printf("\n");
 system("pause");
 return 0;
}
注意:插入排序是一種穩(wěn)定的排序算法,不會(huì)改變原有序列中相同數(shù)字的順序。
插入排序是在一個(gè)已經(jīng)有序的小序列的基礎(chǔ)上,一次插入一個(gè)元素。當(dāng)然,剛開始這個(gè)有序的小序列只有1個(gè)元素,就是第一個(gè)元素。比較是從有序序列的末尾開始,也就是想要插入的元素和已經(jīng)有序的最大者開始比起,如果比它大則直接插入在其后面,否則一直往前找直到找到它該插入的位置。如果碰見一個(gè)和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后順序沒有改變,從原無序序列出去的順序就是排好序后的順序,所以插入排序是穩(wěn)定的。
以上就是對插入排序的詳細(xì)介紹,希望能幫助C語言開發(fā)的同學(xué)理解掌握插入排序。
上一篇:C語言關(guān)系運(yùn)算符實(shí)例詳解
欄 目:C語言
下一篇:VC創(chuàng)建圓角dialog的實(shí)現(xiàn)方法
本文標(biāo)題:C 語言插入排序算法及實(shí)例代碼
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2135.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
 - 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
 - 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘
 


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段
 - 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎
 - 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
 
隨機(jī)閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
 - 01-10delphi制作wav文件的方法
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 - 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
 - 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
 - 01-10C#中split用法實(shí)例總結(jié)
 - 04-02jquery與jsp,用jquery
 - 01-11ajax實(shí)現(xiàn)頁面的局部加載
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
 


