實現過程:
1、實現乙個把陣列建立成大堆根的函式
2、實現乙個堆排序的過程就是對建立好的大堆根交換其前後的兩個元素後(最大的元素就放到了最後),重新再建立陣列長度len–後的大堆。重複如此,直到len = 0;
符號表示過程如下:
陣列a 長度為len
第一次建堆heap[a, len]
第二次交換前後兩個元素後再建堆heap[a, len-1];
一直重複第二個步驟直到len = 0
//使用了異或操作的交換手段
void
swap
(int array,
int a,
int b)
array[a]
^= array[b]
^=array[a]
^=array[b]
;return;}
//建立堆(大根堆)先把陣列按大堆根的方式排序(根的值大於左右子節點)
intcreatebigheap
(int a,
int startindex,
int len)
}//與根值比較,如果根值已經是最大的了就不用交換了,否則交換
if( a[startindex]
< a[maxchildvalueindex])
startindex++;}
return0;
}//堆排序
intheapsort
(int a,
int len)
//交換第一和最後乙個資料後再從新調整堆根
for(
int j = len -
1; j >
0; j--
)return0;
}
實現過程:
1、實現劃分值函式,以劃分值為中心,對陣列進行左右兩級化的劃分(小於劃分值的放到劃分值的左邊大於的放在右邊),並返回劃分值在陣列中的索引
2、使用二分法遞迴實現陣列的排序
**實現
//選取劃分值,劃分後比劃分值小的在左邊比劃分值大的在右邊,最後返回劃分值在陣列中的下標
intdichotomy
(int a,
int startindex,
int endindex)
if(temp > a[j]
)//比劃分值小的要放到劃分值的左邊 ,,下面的內容其實可以優化的,自己想一下吧-_-
//右邊找完後從左邊找
while
((temp >= a[i])&&
(i < j)
)//必須有等於的情況,不然排序不了有重複值的情況
if(temp < a[i]
)//比劃分值大的要放到劃分值的右邊
}return i;
}//快速排序,用二分法的方式左右兩邊遞迴排序
void
quicksort
(int a,
int startindex,
int endindex)
return
;}
//dichotomy**可以做如下的優化:
intdichotomy
(int a,
int startindex,
int endindex)
if(temp > a[j]
)while
((temp >= a[i])&&
(i < j))if
(temp < a[i])}
a[i]
= temp;
//優化點
return i;
}void
quicksort
(int a,
int startindex,
int endindex)
if(partitionindex < endindex)
//優化點
}return
;}
//快速排序的遞迴方法
intpartition
(int a,
int low,
int hight)
a[i]
= posi;
return i;
}void
quicksort
(int a,
int low,
int hight)
if(mid < j)}}
return
;}
實現過程:
1、實現乙個合併函式,函式用於將兩個有序序列合併成為乙個
2、歸併排序實現,我們可以考慮用兩個都只有乙個元素的數字不就都是有序的陣列了,我們只需要遞迴的合併排序不就可以實現遞迴排序了。
**:
//合併操作,使用臨時變數合併兩個有序的序列成乙個
void
merge
(int a,
int low,
int middle,
int high)
else
}while
(i <= middle)
//a左邊的有剩餘,把剩餘的都加入temp的後面
while
(j <= high)
//如果是a的右邊的剩餘,同理
for(i =
0; i )//容易在這裡犯錯注意下標a和temp的開始不一樣
//free(temp);
delete temp;
}//歸併排序
void
mergesort
(int a,
int low,
int high)
return
;}
實現過程:
無非就是每次從陣列中查詢到最小的那個數後與本輪的開始位置的值進行交換
**:
void
selectsort
(int a,
int len)
}//選擇到最小的了,交換兩個數的位置,注意這裡不要用異或操作進行交換值
tempswop = a[i]
; a[i]
= a[tempindex]
; a[tempindex]
= tempswop;
}}
實現過程:
每次比較兩個相鄰的數,並進行交換,這樣可以把最小或者最大的數冒出或者下沉,過程中如果某一輪的的冒泡並沒有進行過任何一次的數交換,那麼說明這個陣列已經是有序的了
**
//使用了異或操作的交換手段
void
swap
(int array,
int a,
int b)
array[a]
^= array[b]
^=array[a]
^=array[b]
;return;}
void
bubblesort
(int a,
int len)}if
(flag)
}return
;}
實現過程:
把乙個陣列看做是有乙個元素的有序數列和剩餘元素組成的無序數列,迴圈無序數列並把其中的每乙個值給插入到有序數列中的合適位置
**:
void
insertionsort
(int a,
int len)
}return
;}
基本排序排序演算法
時空複雜度 氣泡排序 時間o n 2 額外空間o 1 插入排序 時間o n 2 額外空間o 1 選擇排序 時間o n 2 額外空間o 1 基數排序 時間o k n k logn max 額外空間o n 臨時儲存 o b 記數,b為基的大小 記數排序 時間o n k 額外空間o k 希爾排序 時間o ...
基本排序排序演算法
時空複雜度 氣泡排序 時間o n 2 額外空間o 1 插入排序 時間o n 2 額外空間o 1 選擇排序 時間o n 2 額外空間o 1 基數排序 時間o k n k logn max 額外空間o n 臨時儲存 o b 記數,b為基的大小 記數排序 時間o n k 額外空間o k 希爾排序 時間o ...
基本排序演算法
將要排序的物件分作兩部份,乙個是已排序的,乙個是未排序的,從後端未排序部份選擇乙個最小值,並放入前端已排序部份的最後乙個,例如 排序前 70 80 31 37 10 1 48 60 33 80 1 80 31 37 10 70 48 60 33 80 選出最小值1 1 10 31 37 80 70 ...