內部排序之交換排序

2021-07-29 13:56:54 字數 2563 閱讀 4239

快速交換排序簡介及其**

冒泡交換排序及其**

交換排序總結

我們知道假如乙個已排好序的陣列,假如是從小到大公升序排列,則隨便取其中乙個數n,則n左邊所有數都小於或等於n,右邊的都大於或等於n.

那反向思維下,我們先隨便取陣列第乙個數為基準x,然後將所有小於它的數交換到左邊,大於它的數交換到右邊.最後x可能就被交換到中間某個位置.以x為分界線,陣列被分成兩部分.接著再對兩部分重複同樣的操作.這裡用到了遞迴的思想.

快速排序裡面的元素交換又叫填坑,首先取出乙個值做標準值basic,則該值所在的位置i變成乙個坑,從後面開始遍歷碰到大於x的值(假如下標是j)就把該值交換到位置i,這樣位置j就多出乙個坑,從前面遍歷,碰到大於basic的值(假如位置是i)則把該值交換到位置j.這樣i又多出乙個坑. 這樣不停的從後到前遍歷,從前到後遍歷,i與j值不斷的變.最後i == j時停止.而此時位置i肯定是空著的,於是把值basic移到這裡來.這樣basic左邊的值都小於它,右邊的都大於它了.

所以整個操作分三步.

1.取乙個數作為基準值(可以隨意取乙個,不過一般情況取第乙個)

2.不停的比較交換資料,使最終基準值左邊的都小於它,右邊的都大於它

3.以步驟2中基準值的位置為中點,把待排序陣列分為兩部分,再分別重複步驟2(這裡用了遞迴的思想)

s=0,t=9;r[s]=6,r[t]=5;並把s賦給i,把t賦給j;取一般的標準值tmp,即第乙個元素。,tmp=r[s];

此時先看r[j]=5,5小於6,應該在6的右邊,所以把r[9]賦值給r[0],因為r[9]的元素被挪走了所以此時r[9]為乙個坑,需要乙個元素來填坑。要填坑,就要從i的下標裡面找,此時r[0]已經是5了。5<6,符合條件i++,r[1]為8,大於6,需要移動,於是把r[j]=r[i],剛好填了r[9]的空。

依此類推,從j下標開始的,如果元素大於等於標準元素,j–,進行下一次比較,否則進行移動。

從i下標開始的,如果元素小於等於標準元素,i++進行下一次比較,否則進行移動。

最後i==j時,r[i]=tmp。

**:

#include

#include

#define maxsize 100

typedef

int keytype;

typedef

struct

rectype;

void quicksort(rectype r,int s,int t)

r[i] = r[j];

while (i < j && r[i].key <= tmp.key)

r[j] = r[i];

}r[i] = tmp;

quicksort(r, s, i - 1);

quicksort(r, i + 1, t);

}}int main(void)

; int i,n = 10;

for (i = 0; i < n; i++)

printf("排序前");

for (i = 0; i < n; i++)

printf("\n");

quicksort(r, 0, n-1);

printf("排序後");

for (i = 0; i < n; i++)

printf("\n");

system("pause");

return

0;}

**:

#include

#include

#include

//從頭向尾遍歷

//相鄰兩數進行比較

//將最大數(相對)沉入尾部(相對)

void bubblesort1(int *arr,int sz)}}

}//從尾向頭遍歷

//相鄰兩數進行比較

//將最小數(相對)冒泡到頭部(相對)

void bubblesort2(int *arr,int sz)}}

}//測試函式

//為了方便起見,將引數設定為乙個函式指標

void testbubblesort(void (*bubblesort)(int *arr,int sz));

int i = 0;

int sz = sizeof(arr)/sizeof(arr[0]);

bubblesort(arr,sz);

for(i=0; iprintf("%d ",arr[i]);

}printf("\n");

}int main(){

testbubblesort(bubblesort1);

testbubblesort(bubblesort2);

system("pause");

return

0;

測試結果:

經典內部排序之交換排序

經典內部排序演算法有交換排序 插入排序 選擇排序 歸併排序 分配排序。分類如下 交換排序 氣泡排序 快速排序。插入排序 直接插入排序 折半插入排序 希爾排序。選擇排序 直接選擇排序 堆排序。歸併排序 分配排序 基數排序 桶排序。本博文將介紹交換排序。一 氣泡排序 氣泡排序演算法的運作如下 比較相鄰的...

排序專題之交換排序

在交換排序這一類中,分為氣泡排序和快速排序,快速排序是建立在 氣泡排序基礎上的乙個優化,很有意義的乙個排序,在各種acm競賽 以及其他領域中經常被用到 接下來,我們先看一看氣泡排序。氣泡排序基本思想 通過無序區中相鄰記錄關鍵字間的比較和位置的交換,使關鍵字最小的記錄如氣泡一般逐漸往上 漂浮 直至 水...

排序演算法之交換排序

交換排基本思想 兩兩比較待排序元素的關鍵字,發現兩個元素的次序相反時即進行交換,知道沒有反序的元素為止。本節介紹兩種交換排序,即氣泡排序和快速排序。氣泡排序 每次只能和相鄰的位置數進行交換,效率低 include int a 100 void quicksort int left,int right...