雷火电竞-中国电竞赛事及体育赛事平台

歡迎來到入門教程網!

C語言

當前位置:主頁 > 軟件編程 > C語言 >

希爾排序算法的C語言實現(xiàn)示例

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊:

希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。希爾排序是非穩(wěn)定排序算法。

希爾排序是基于插入排序的以下兩點性質而提出改進方法的:

插入排序在對幾乎已經排好序的數據操作時,效率高,即可以達到線性排序的效率
但插入排序一般來說是低效的,因為插入排序每次只能將數據移動一位

希爾排序通過將比較的全部元素分為幾個區(qū)域來提升插入排序的性能。這樣可以讓一個元素可以一次性地朝最終位置前進一大步。然后算法再取越來越小的步長進行排序,算法的最后一步就是普通的插入排序,但是到了這步,需排序的數據幾乎是已排好的了(此時插入排序較快)。

假設有一個很小的數據在一個已按升序排好序的數組的末端。如果用復雜度為O(n2)的排序(冒泡排序或插入排序),可能會進行n次的比較和交換才能將該數據移至正確位置。而希爾排序會用較大的步長移動數據,所以小數據只需進行少數比較和交換即可到正確位置。

一個更好理解的希爾排序實現(xiàn):將數組列在一個表中并對列排序(用插入排序)。重復這過程,不過每次用更長的列來進行。最后整個表就只有一列了。將數組轉換至表是為了更好地理解這算法,算法本身僅僅對原數組進行排序(通過增加索引的步長,例如是用i += step_size而不是i++)。

C語言實現(xiàn)示例

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define LEN 10

typedef int dataType;

//初始化數組,賦值整數隨機數
void initArr(dataType arr[], int len);
//希爾排序
void shellSort(dataType arr[], int len);
//交換兩個數
void swap(dataType &x,dataType &y);
//打印數組元素
void print(dataType arr[], int len);

int main()
{
 dataType arr[LEN];
 initArr(arr,LEN);
 printf("================希爾排序================");
 //輸出排序前的數組元素
 printf("\n排序前數組元素:");
 print(arr,LEN);
 shellSort(arr,LEN);
 printf("\n排序后數組元素:");
 print(arr,LEN);
 printf("\n");
 return 0;
}


//初始化數組,賦值整數隨機數
void initArr(dataType arr[], int len)
{
 int i = 0;
 srand((unsigned)time(NULL));
 for(i = 0; i < len; i++)
 arr[i] = rand();
}
//希爾排序
void shellSort(dataType arr[], int len)
{
 int h = 0;
 int i = 0;
 int j = 0;
 //設置步長
 for(h = 1; h < len; h = 3 * h + 1)
 ;
 while(h)
 {
 h /= 3;
 if(h < 1)
  break;
 for(i = h; i < len; i++)
  for(j = i; j >= h; j-=h)
  {
  if(arr[j-h] < arr[j])
   break;
  swap(arr[j-h],arr[j]);
  }
 }
}

//交換兩個數
void swap(dataType &x,dataType &y)
{
 dataType temp;
 temp = x;
 x = y;
 y = temp;
}

//打印數組元素
void print(dataType arr[], int len)
{
 int i = 0;
 for(i = 0; i< LEN; i++)
 {
 if(i % 5 == 0)
 {
  printf("\n");
 }
 printf("%d\t",arr[i]);
 }
}

上一篇:C++基礎學生管理系統(tǒng)

欄    目:C語言

下一篇:Linux中使用C語言實現(xiàn)基于UDP協(xié)議的Socket通信示例

本文標題:希爾排序算法的C語言實現(xiàn)示例

本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2403.html

網頁制作CMS教程網絡編程軟件編程腳本語言數據庫服務器

如果侵犯了您的權利,請與我們聯(lián)系,我們將在24小時內進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網 版權所有