#include <iostream>
using namespace std;
void printArray(int *arr, int size)
{
for(int i=0; i<size; ++i)
{
cout<< arr[i]<< ' ';
}
cout<<endl;
}
int partition(int array[], int high, int low)
{
int pivot = array[high];
while (low < high) {
while (low < high && array[low] <= pivot ) {
low++;
}
array[high] = array[low];
// printArray(array, 7);
while (low < high && array[high] >= pivot ) {
high--;
}
array[low] = array[high];
// printArray(array, 7);
}
array[low] = pivot;
// cout<<"pos:"<<low<<endl;
return low;
}
void qsort_c(int array[], int high, int low)
{
if(low >= high)
return ;
int pos = partition(array, high, low);
qsort_c(array, high, pos+1);
qsort_c(array, pos-1, low);
}
void quick_sort(int array[], int size)
{
qsort_c(array, size-1, 0);
}
int main()
{
int array[7] = {10, -22, 211, 120, -2, 23, 120};
int size = sizeof (array) / sizeof (*array);
printArray(array, size);
// partition(array, size-1, 0);
quick_sort(array, size);
printArray(array, size);
return 0;
}
#include <iostream>
using namespace std;
void PutArray(int *array, int size) {
// cout << " Array:";
for (int i = 0; i < size; ++i) {
cout << array[i] << " ";
}
cout << endl;
}
int partition(int *array, int high, int low) {
int pivot = array[low];
while (low < high) {
/*
*
* 1、low<high的条件不能去掉,在移动low和high的时候随时可能终止,跳出循环
* 2、pivot <= 中的= 不能去掉,不然两个23归位时指针不移动了,可能出现死循环 Array:0 -22 23 23 640 241 50
*
*/
while ((low < high) && pivot <= array[high]) //
high--;
swap(array[low], array[high]);
#if 0
cout << "<==:" << "low:" << low << "high:" << high;
PutArray(array, 7);
#endif
while ((low < high) && pivot >= array[low])
low++;
swap(array[low], array[high]);
#if 0
cout << "==>:" << "low:" << low << "high:" << high;
PutArray(array, 7);
#endif
}
// cout << "pos:" << low << endl;
return low;
}
void QSort(int array[], int high, int low) {
if (low < high) {
int pos = partition(array, high, low);
QSort(array, pos - 1, low);
QSort(array, high, pos + 1);
}
}
void QuickSort(int array[], int size) {
QSort(array, size - 1, 0);
}
int main() {
int array[7] = {23, -22, 241, 23, 640, 0, 50};
// int array[2] = {23, -22};
int size = sizeof(array) / sizeof(*array);
PutArray(array, size);
// InsertionSort(array, size);
// ShellSort(array, size);
// QuickSort_2(array, size);
// partition(array, size, 0);
QuickSort(array, size);
PutArray(array, size);
return 0;
}
void QuickSort_2(int array[], int size) {
int lower_list_len = 0;
int pivot = array[size - 1];
if (size <= 1) {
return;
}
for (int i = 0; i < size; ++i) {
if (array[i] < pivot) {
swap(array[i], array[lower_list_len]);
lower_list_len++;
}
}
// cout << "low:" << lower_list_len << endl;
int high_list_len = size - lower_list_len - 1;
array[size - 1] = array[lower_list_len];
array[lower_list_len] = pivot;
// cout << "high_list_len:" << high_list_len << endl;
QuickSort_2(array, lower_list_len);
QuickSort_2(&array[lower_list_len + 1], high_list_len);
}
#include <QCoreApplication>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
auto put = [](vector<int> &array){
std::copy(array.begin(), array.end(), ostream_iterator<int>(cout , " "));
std::cout << std::endl;
};
int partition_1(vector<int> &v, int head, int tail)
{
int pivot = v.at(head);
int i = head + 1;
int j = head;
for (;i<=tail;i++)
{
if(v.at(i) < pivot)
{
std::swap(v.at(i),v.at(++j));
}
}
std::swap(v.at(head),v.at(j));
return j;
}
int partition_2(vector<int> &v, int head, int tail)
{
int pivot = v.at(head);
int i = head + 1;
int j = tail;
for (;i <= j;)
{
while (i <= j && v.at(j) >= pivot)
j--;
while (i <= j && v.at(i) <= pivot)
i++;
if(i <= j)
{
std::swap(v.at(i),v.at(j));
}
}
cout << head << ":";
std::swap(v.at(head),v.at(j));
put(v);
return j;
}
int partition(vector<int> &array, int low, int high)
{
int pivot = array[high];
while (low < high) {
while (low < high && array[low] <= pivot ) {
low++;
}
array[high] = array[low];
// printArray(array, 7);
while (low < high && array[high] >= pivot ) {
high--;
}
array[low] = array[high];
// printArray(array, 7);
}
array[low] = pivot;
// cout<<"pos:"<<low<<endl;
return low;
}
void qSort(vector<int> &v, int head, int tail)
{
if(head > tail)
return ;
int piovt = partition(v, head, tail);
qSort(v, head, piovt - 1);
qSort(v, piovt + 1, tail);
}
int main(int argc, char *argv[])
{
int a[] = {1, 12, 3, 44, -5};
int s = sizeof(a) / sizeof(int);
vector<int> array(a, a + s);
qSort(array, 0, array.size()-1);
put(array);
return 0;
}
#if 0
int main(int argc, char *argv[])
{
QCoreApplication core(argc, argv);
//for(int i=0; i<)
int a[] = {1, 12, 3, 44, -5};
int s = sizeof(a) / sizeof(int);
vector<int> array(a, a + s);
auto put = [](vector<int> &array){
std::copy(array.begin(), array.end(), ostream_iterator<int>(cout , " "));
std::cout << std::endl;
};
//std::copy(array.begin(), array.end(), ostream_iterator<int>(cout , " "));
int size = array.size() - 1;
int flag = true;
for (size_t i = 0; flag ; i++)
{
flag = false;
for (size_t j = size; j > i; j--)
{
if (array[j] < array[j-1])
{
std::swap(array[j], array[j-1]);
flag = true;
}
}
cout << "i:" << i << " ";
put(array);
}
put(array);
return core.exec();
}
#endif
备份地址: 【O(nLogn)排序 :快速】