前面我們介紹過了插入排序和選擇排序。
插入排序,鏈結戳這裡:
選擇排序,鏈結戳這裡:
本文我們學習交換排序。
交換排序分為氣泡排序和快速排序。
氣泡排序的基本思想相信大家都已經不陌生。依次比較相鄰的兩個數,將小數放在前面,大數放在後面。
**:
void bubblesort(int *a, size_t n)
}if (exchange == false)
--end;}}
測試:
int main()
; int sz = sizeof(a) / sizeof(a[0]);
bubblesort(a, sz);
for (int i = 0; i < sz; i++)
cout
<< endl;
system("pause\n");
return
0;}
執行結果:
快速排序是面試中最常考的,這裡我們給出三種快速排序的方法。
(1)左右指標法:
基本思想:選出乙個key值,begin去查詢陣列中比key大的值,end去查詢陣列中比key小的值,遞迴子問題。可以知道的是,當陣列正好是逆序時,快排的效率最低,為了防止最壞的情況,我們採取三數取中法。
**:
//三數取中法
int getmidindex(int* a, int left, int right)
else
// left > mid right
}// 左右指標法
int partsort1(int* a, int left, int right)
while (begin
< end && a[end] >= key)
if (begin
< end)
swap(a[begin], a[end]);
}swap(a[begin], a[right]);
return
begin;
}
(2)挖坑法將a[right]賦值給key,右邊就成了乙個「坑」,再用left去找比key大的放到右邊的坑,用right找比key小的放到左邊的坑,當left和right相遇時,是key值的位置。
int partsort2(int *a, int
left, int
right)
a[right] = a[left];
while (left
< right && a[right] >= key)
a[left] = a[right];
}a[left] = key;
return left;
}
(3)前後指標法定義乙個prev在cur之前,若cur
int partsort3(int* a, int
left, int
right)
++cur;
}swap(a[++prev], a[right]);
return prev;
}
測試:
//遞迴解法
void quicksort(int *a, int left, int right)
if (left < right)
}//非遞迴
#include
void quicksortnonr(int* a, int left, int right)
while (!s.empty())
if (div + 1
< end)
}}int main()
; int sz = sizeof(a) / sizeof(a[0]);
quicksort(a,0,sz-1);
for (int i = 0; i < sz; i++)
cout
<< endl;
system("pause\n");
return
0;}
執行結果:
排序演算法 交換排序
交換排序的基本思想 兩兩比較待排序元素的關鍵字,發現兩個元素的次序相反時則進行交換,直到沒有反序的元素為止。1.氣泡排序 交換排序 演算法 氣泡排序 bubble sort 輸入 待排序元素的陣列,待排序元素個數 輸出 原理 通過無序區中相鄰元素間關鍵字的比較和位置的交換,使關鍵字最小的元素如氣泡一...
排序演算法 交換排序
基本思想 在乙個待排序序列中,兩兩比較元素的排序碼,如果不滿足次序要求則進行交換,直到整個排序序列滿足要求。思想 對待排序序列從前向後,依次比較相鄰元素的排序碼,若發生逆序,則進行交換。實現 include void bubblesort int p,int n if flag 減少不必要的比較 r...
交換排序演算法
快速排序 為啥叫快速排序,因為速度快,效率高 1.先找乙個數作為基準。作為基準的這個數,一趟排下來,左邊的數必小於它,右邊的數必大於它,也就是說,它找到了自己的位置。2.將兩個指標i,j分別指向表的起始 基準 和最後的位置。3.比較j指標的數字是否小於基準,j 直到j小於基準,交換位置 4.比較i指...