排序演算法備份

2021-05-17 10:38:23 字數 3238 閱讀 8762

若干基本內排序演算法(c語言)的備份,閒時來看看,以防忘記。

1.插入排序

void insertsort(elemtype x,int n)

int i,j;

elemtype temp;

for(i=0;itemp=x[i+1];

j=i;

while(j>-1&&temp.keyx[j+1]=x[j];

j--;

x[j+1]=temp;

2.選擇排序

void selectsort(elemtype x,int n)

int i,j,small;

elemtype temp;

for(i=0;ismall=i;

for(j=i+1;jif(x[j].keyif(small!=i)

temp=x[i];

x[i]=x[small];

x[small]=temp;

3.交換排序

void bubblesort(elemtype x,int n)

int i,j,flag=1;

elemtype temp;

for(i=0;iflag=0;

for(j=0;jif(x[j].key>x[j+1].key)

flag=1;

temp=x[j];

x[j]=x[j+1];

x[j+1]=temp;

4.快速排序

void quicksort(elemtype x,int low,int high)

int i,j;

elemtype temp;

i=low;

j=high;

temp=x[low];

while(i//在序列的右端掃瞄

while(iif(ix[i]=x[j];

i++;

//在序列的左端掃瞄

while(iif(ix[j]=x[i];

j--//確定了x[low]在有序序列中的最終位置

x[i]=temp;//temp==x[low]

//對子序列進行快速排序

if(lowif(j+15.希爾排序

這個排序非常複雜,看了程式就知道了。

首先需要乙個遞減的步長,這裡我們使用的是9、5、3、1(最後的步長必須是1)。

工作原理是首先對相隔9-1個元素的所有內容排序,然後再使用同樣的方法對相隔5-1個元素的排序

以次類推。

#include <iostream.h>

void shellsort(int* pdata,int count)

int step[4];

step[0] = 9;

step[1] = 5;

step[2] = 3;

step[3] = 1;

int itemp;

int k,s,w;

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

k = step;

s = -k;

for(int j=k;j<count;j++)

itemp = pdata[j];

w = j-k;//求上step個元素的下標

if(s ==0)

s = -k;

s++;

pdata[s] = itemp;

while((itemp<pdata[w]) && (w>=0) && (w<=count))

pdata[w+k] = pdata[w];

w = w-k;

pdata[w+k] = itemp;

void main()

int data = ;

shellsort(data,12);

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

cout<<data<<" ";

cout<<"\n";

呵呵,程式看起來有些頭疼。不過也不是很難,把s==0的塊去掉就輕鬆多了,這裡是避免使用0

步長造成程式異常而寫的**。這個**我認為很值得一看。

避免使用2的冪次步長,它能降低演算法效率。」另外演算法的複雜度為n的1.2次冪。同樣因為非常複雜並

「超出本書討論範圍」的原因(我也不知道過程),我們只有結果了。

6.堆排序 

// array是待調整的堆陣列,i是待調整的陣列元素的位置,length是陣列的長度

void heapadjust(int array, int i, int nlength)//本函式功能是:根據陣列array構建大根堆

int nchild;

int ntemp;

for (ntemp = array[i]; 2 * i + 1 < nlength; i = nchild)

// 子結點的位置=2*(父結點位置)+ 1

nchild = 2 * i + 1;

// 得到子結點中較大的結點

if (nchild < nlength - 1 && array[nchild + 1] > array[nchild])

++nchild;

// 如果較大的子結點大於父結點那麼把較大的子結點往上移動,替換它的父結點

if (ntemp < array[nchild])

array[i]= array[nchild];

else // 否則退出迴圈

break;

// 最後把需要調整的元素值放到合適的位置

array[nchild]= ntemp;

// 堆排序演算法

void heapsort(int array, int length)

// 調整序列的前半部分元素,調整完之後第乙個元素是序列的最大的元素

for (int i = length / 2 - 1; i >= 0; --i)

heapadjust(array, i, length);

// 從最後乙個元素開始對序列進行調整,不斷的縮小調整的範圍直到第乙個元素

for (int i = length - 1; i > 0; --i)

// 把第乙個元素和當前的最後乙個元素交換,

// 保證當前的最後乙個位置的元素都是在現在的這個序列之中最大的

swap(&array[0], &array[i]);

// 不斷縮小調整heap的範圍,每一次調整完畢保證第乙個元素是當前序列的最大值

heapadjust(array, 0, i);

各種排序演算法java實現,好文,做個備份

插入排序 package org.rut.util.algorithm.support import org.rut.util.algorithm.sortutil author treeroot since 2006 2 2 version 1.0 public class insertsort ...

排序演算法 排序演算法彙總

排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...

排序演算法 排序演算法彙總

排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...