最近只看了冒泡和快排這兩個演算法,今天面試就讓寫排序,用電腦寫,一去就讓寫**,賊慌,然後面試官小姐姐真的賊好看,就是和面試官小哥談論我的簡歷,坐在我對面,看著我寫**真的賊慌。。
一開始本來想寫快排,因為緊張,大腦短路,滿腦子都在冒泡泡。。最後還是寫了冒泡,,這裡再回顧一下冒泡和快排吧,鞏固一下,免得一緊張就慌的寫不出來。
(一)冒泡泡排序法
總的思想就是從待排序表的底部,通過兩兩交換的將較小的元素交換到排序表上層。
注意兩點:
1、已經排過序的較小的元素不參與之後的排序,即巢狀的迴圈裡面,從表尾一直迴圈到已經排序好的元素位置。
2、當剩餘的元素已經有序時,不需要再執行剩下的迴圈判斷工作,主要通過新增標記變數來判斷是否有進行交換。
帶排序的順序表結構和swap函式如下:
typedef structsqlist;
void swap(sqlist *l, int i, int j)
冒泡實現(親測有效)
void bubblesort(sqlist *list)
} }}
(二)快速排序(20世紀十大演算法之一,聽起來好厲害)
是基於分治法的交換排序。根據某個基準數值(通常是第乙個),將表分成兩部分,使得小於這個基準數的數都在基準數的左邊,大於這個基準數的數都在基準數的右邊。再分別對這兩邊進行同樣的操作。需要用到遞迴的思想。
實現如下,**量很少,重點在partition()函式的實現上。
void quicksort(sqlist *list, int low, int high)
}
需要儲存當前待排元素的基準值pivot;指向表頭的指標low,用下標表示(為了找到比pivot大的值);指向表尾的指標為high,用下標表示(為了找到比pivot小的值)。
再來琢磨一下這個partition()方法,分治的方法有好幾種,我就主要理解了以前課本上學的從兩端開始查詢,先找到比pivot小的(一定要先移動high指標),再找到比pivot小的,交換他們的位置,直到兩個指標相遇,用pivot替換這兩個指標相遇的位置,就把表分成了兩個部分。主要要對比的就是pivot、a[low]、a[high]。把這三個數的順序排好,填到相應的位置。先找到最小的,放在最左端,再找到最大的放到最右端,中間就放pivot。實現了整個交換的過程。
int partition(sqlist *list, int low, int high)
list->a[low] = list->a[high];//從表的尾巴開始找到了比pivot小的,放到pivot左端
while (low < high&&list->a[low] <= pivot)
list->a[high] = list->a[low];//從表的尾頭開始找到了比pivot大的,放在pivot右端
} list->a[low] = pivot;//在兩個指標的相遇位置放下pivot使得左邊的元素都小於pivot右邊的都大於piovt
return low;
}
測試用例:
int _tmain(int argc, _tchar* argv)
; int len = sizeof(data) / sizeof(int);
for (int i = 0; i < len; i++)
list.len = len;
//cout << len << endl;
//bubblesort(&list);
quicksort(&list,0,len-1);
for (int i = 0; i < list.len; i++)
return 0;
}
面試 排序 一 交換排序
一 交換排序 兩兩比較待排序的關鍵字,並交換不滿足次序要求的那些偶對,直到全部滿足為止。常見的交換排序有氣泡排序和快速排序 1.氣泡排序 1 過程 比較相鄰元素,使關鍵字較小的元素交換至關鍵字較大的元素之上,使得經過一次氣泡排序後,關鍵字最小的元素到達最頂端,接著找到第二小的元素,依次類推。氣泡排序...
資料結構 交換排序
交換排序的基本思想是 兩兩比較待排序記錄的關鍵字,如果發生逆序 即排列順序與排序後的次序正好相反 則交換之,直到所有記錄都排好序為止。基本思路 每趟不斷將記錄兩兩比較,並按 前小後大 或 前大後小 規則交換。優點 每趟結束時,不僅能擠出乙個最大值到最後面位置,還能同時部分理順其他元素 一旦下趟沒有交...
資料結構 排序之交換排序
本節將兩種交換排序氣泡排序和快速排序 氣泡排序是最簡單的交換排序方法,比較相鄰兩個記錄的關鍵字,將大的放到右邊,小的放到左邊,如圖所示 從而使關鍵字小的左移 大的右移 每一次迴圈最右邊的必定是關鍵字最大的元素,外面再加一層迴圈即可得到有序序列。實現 include using namespace s...